2013-09-11 2 views
-1

В настоящее время я пытаюсь взять список заказов по набору клиентов и найти последний заказ каждого из этих клиентов, проверить элементы в этом заказе и сравнить их со списком строк в NHibernate. Однако я полностью зациклен на том, как я могу взять клиентов и найти их дату последнего заказа, поскольку я использую NHibernate 1.2 (я не могу это обновить), поэтому у меня нет доступа к функциональности LINQ в более новых версиях.Сортировка списка по дате последнего заказа

Если бы кто-нибудь мог указать мне в правильном направлении, это было бы потрясающе, пока у меня это есть.

IList<Order> people = new List<Order>(); 
ICriteria criteria = CoreHttpModule.Session.CreateCriteria(typeof(Order)); 
string[] instrumentList = { "Item1", "Item2", "Item3" }; 

public void CleanList() 
{ 
    criteria.CreateAlias("Customer", "customer", NHibernate.SqlCommand.JoinType.LeftOuterJoin); 
    criteria.CreateAlias("Purchaser", "purchaser", NHibernate.SqlCommand.JoinType.LeftOuterJoin); 
    criteria.CreateAlias("Agent", "agent", NHibernate.SqlCommand.JoinType.LeftOuterJoin); 
} 
+1

Вы можете начать с предоставления нам некоторых примеров того, как связаны объекты «Заказ», «Клиент», «Покупатели», «Агент». Я даже не вижу набор 'Customer', о котором вы говорите. Существует только 'instrumentList' – xanatos

+0

Извините, в основном, как это работает, так это то, что заказ представляет собой полную таблицу сведений о заказе, которая имеет полную информацию о ней, а остальные три связаны с ней через customer_id –

+0

Обычно вы начинаете с написания SQL запрос, который вы хотите, а затем переведите его в NHibernate. Критерии запроса отображают почти 1: 1 для SQL-запросов. – xanatos

ответ

0

Сначала вы строите запрос в SQL:

SELECT O.* 
    FROM Orders order1 
    INNER JOIN Customers customer1 ON customer1.ID = order1.CustomerId 
    WHERE EXISTS (
     SELECT TOP 1 ID FROM Orders order2 
      INNER JOIN Customers customer2 ON customer2.Id = order2.CustomerId 
      WHERE customer2.Id = customer1.Id 
      ORDER BY order2.OrderDate DESC 
    ) 

Затем вы пытаетесь строить тот же запрос в NHibernate

DetachedCriteria dc = DetachedCriteria.For(typeof(Order), "order2") 
    .CreateAlias("Customer", "customer2", JoinType.InnerJoin) 
    .Add(Restrictions.EqProperty("customer2.ID", "customer1.ID")) 
    .AddOrder(NHibernate.Criterion.Order.Desc("order2.OrderDate")) 
    .SetProjection(Projections.Property("order2.ID")) 
    .SetMaxResults(1); 

ICriterion condition = Subqueries.Exists(dc); 

ICriteria criteria = Session.CreateCriteria(typeof(Order), "order1") 
    .CreateAlias("Customer", "customer1", JoinType.InnerJoin) 
    .Add(condition); 

Единственный большой предел, который NHibernate есть то, что вы можете» t создавать JOINs «на лету»: вы можете подключаться только к таблицам (и по полях) JOINed в файле сопоставления.

Обратите внимание, что это встроено с Order s сначала, поэтому Customer s без Order s не будет отображаться.

Вам нужно будет изменить имена полей.

Смежные вопросы