2015-11-18 7 views
0

я следующие таблицы:NHibernate - Присоединение по ID собственности, не возражают

Customer(ID, Name) 
Transaction(ID, CustomerID, Date) 

Объекты отображения для таблиц определяются без объектов, только примитивные типы:

Customer(int ID, string Name) 
Transaction(int ID, string CustomerID, DateTime Date) 

И я хочу выбрать всех клиентов и их последнюю дату покупки в порядке возрастания. Я попытался с помощью псевдонимов и создания объединения с идентификатором клиента и идентификатор клиента сделки, но я получаю исключение, говоря

не мог решить собственности: клиент: Сделки

Transaction transaction = null; 
Customer customer = null; 

session.QueryOver<Transaction>(() => transaction). 
       SelectList(list => list. 
        Select(() => customer.Name). 
        SelectGroup(() => transaction.CustomerId). 
        SelectMin(() => transaction.Date)). 
       JoinQueryOver(() => customer).Where(() => customer.Id == transaction.Id). 
       OrderBy(Projections.Min<Transaction>(trans => trans.Date)).Asc. 
       List<object[]>(). 
       ToList(); 

Я не понимаю почему он пытается искать свойство клиента в транзакции, единственный случай, который они выполняют в строке, находится в предложении where. Я, вероятно, не очень хорошо получил «Присоединиться».

Может ли кто-нибудь пролить свет на это исключение?

+0

Я бы сказал, что ответ здесь http://stackoverflow.com/q/20528760/1679310 –

ответ

0

Ошибка при отправке сообщения является следующим: JoinQueryOver(() => customer) Он сообщает NHibernate, чтобы попытаться найти свойство «клиент» вашего класса Transaction.

Я считаю, что ваш запрос должен выглядеть следующим образом:

session.QueryOver<Transaction>(() => transaction). 
SelectList(list => list. 
    SelectSubQuery(QueryOver.Of<Customer>().Where(c => c.ID == transaction.ID).Select(c => c.Name)). 
    SelectGroup(() => transaction.CustomerId). 
    SelectMin(() => transaction.Date) 
). 
.OrderBy(Projections.Min<Transaction>(trans => trans.Date)).Asc. 
List<object[]>(). 
ToList();