Выберите объект, когда свойство равно Max с NHibernate

У нас есть запрос, который выбирает строки в зависимости от значения другого, т.е. макс. Я не думаю, что это действительно имеет большой смысл, поэтому вот запрос:

var deatched = DetachedCriteria.For<Enquiry>("e2")
   .SetProjection(Projections.Alias(Projections.Max("Property"), "maxProperty"))
   .Add(Restrictions.EqProperty("e2.EnquiryCode", "e.EnquiryCode"));

session.CreateCriteria(typeof(Enquiry), "e")
   .Add(Subqueries.PropertyEq("Property", deatched))
   .AddOrder(Order.Asc("EnquiryCode"));

Мой вопрос, это лучший способ? Кто-нибудь может предложить лучший способ?

10.12.2008 15:57:30
Я думаю, что это лучший способ сделать это. В SQL вы должны написать: SELECT e. * Из e, где e.Property = (SELECT MAX (e2.Property), где e2.EnquiryCode = e.EnquiryCode), и это все, что вы делаете в своем HQL.
kͩeͣmͮpͥ ͩ 12.12.2008 15:19:43
Спасибо, это помогло мне с подобной проблемой (даже если у вас нет ответов!)
PandaWood 18.03.2011 06:18:37
3 ОТВЕТА

Для агрегаций лучше использовать SQL, а не HQL. Использование Nhibernate только для основных сущностей и их отношений (очень удобный дизайн). Хранимые процедуры - лучшее место для этих агрегаций и функций, потому что они зависят от данных, а не от объектов.

1
1.12.2011 18:58:42

Я думаю, что это должно работать:

(from e in NHibernateSession().Query<Enquiry>()
    where e.Property == (
    (
        from e2 NHibernateSession().Query<Enquiry>()
        where e2.EnqueryCode == e.EnquiryCode
        select e2.Property).Max()
    )
    select e
).ToList<Enquiry>()
0
19.07.2012 16:50:03

Вы должны быть в состоянии сделать это с проекцией:

session.CreateCriteria(typeof(Customer))
  .SetProjection( Projections.Max("Id") )
  .UniqueResult();

Как описано Критерии Nhibernate: «выберите max (id) ...»

1
23.05.2017 11:56:15