2010-09-17 2 views
1

Я использую nHibernate с C#, чтобы получить список записей или строк из базы данных, как показано в первых двух строках кода ниже. Это прекрасно работает. Я хочу сделать несколько отдельных полей из записи, а не всей записи. Я пробовал различные методы и не могу найти примеров того, как это сделать. Может ли кто-нибудь взглянуть на приведенный ниже код и сообщить мне, если я уйду в неправильном направлении.nHibernate Выберите оператор для определенных полей

Спасибо!

// THIS WORKS - Retrieve a list of my records from the table. 
Ilist<MyClass> classList = db.Session.CreateQuery("FROM MyTable WHERE t.Name='AName'").List<MyClass>(); 


// THIS WORKS - Retrieve a list of strings from the table 
IList<string> stringList = db.Session.CreateQuery("SELECT c.ConstName FROM MyTable c WHERE c.Name='AName'").List<string>(); 


// THIS DOES NOT WORK (RUN-TIME ERRORS). HOW CAN I SELECT ONLY A FEW FIELDS FROM EACH RECORD? 
// This class contains only the records I want. 
public struct MyClassB 
{ 
    private string Name; 
    private string Address; 

    public string Name 
    { 
     get { return Name; } 
     set { Name = value; } 
    } 

    public string Address 
    { 
     get { return Address; } 
     set { stationName = Address; } 
    } 
}  


IList<MyClassB> classListB = db.Session.CreateQuery("SELECT t.Name, t.Address FROM MyTable t WHERE t.Name='AName'").List<MyClassB>(); 

ответ

0

Вы пытаетесь ввести анонимный тип в свой MyClassB, который недопустим. Вместо этого создайте сопоставление для MyClassB.

Или просто использовать:

var specificFields = db.Session.CreateQuery("SELECT t.Name, t.Address FROM MyTable t WHERE t.Name='AName'").List(); 

var specificFields = db.Session.CreateQuery("SELECT t.Name, t.Address FROM MyTable t WHERE t.Name='AName'").List<Tuple<string,string>>(); 

Объекты в списке будут иметь два свойства.

+0

Не мог бы вы подробнее остановиться на картографической части? Это работает, и я получаю массив объектов объектов. Я думаю, что я мог бы получить доступ к полям, выполнив спецификацию [record] [field], но компилятор не позволит индексировать объект типа. –

+0

Часть отображения. Вам просто нужно создать сопоставление для MyClassB, которое указывает на ту же таблицу, что и MyClassA, а затем отображает только два свойства MyClassB (и, конечно, часть Identity). Просто не забудьте разрешить обновления и удаления для MyClassB, так как у него нет всех строк ... – Goblin

+0

Извините, но вы не указали OP, как это сделать с предоставленной ими моделью. –

2

Взгляните на AliasToBeanResultTransformer - использование демонстрируется here.

-1

Пока ваш класс имеет застройщик, вы должны быть в состоянии сделать следующее:

IList<MyClassB> classListB = db.Session.CreateQuery("SELECT new MyClassB(t.Name, t.Address) FROM MyTable t WHERE t.Name='AName'").List<MyClassB>(); 
+0

Будет ли это действительно брошено или вам нужен трансформатор результата? –

+0

@TimothyGonzalez это действительно будет отличать, см. Полный рабочий пример здесь: https://gist.github.com/alextrofymenko/ada9819f92c8e1a8ef5531798d7ed829 – Shagglez