У нас есть запрос, который выбирает строки в зависимости от значения другого, т.е. макс. Я не думаю, что это действительно имеет большой смысл, поэтому вот запрос:
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"));
Мой вопрос, это лучший способ? Кто-нибудь может предложить лучший способ?
Chris Canal
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
Sleiman Jneidi
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
Tony Wolfango
19.07.2012 16:50:03
Вы должны быть в состоянии сделать это с проекцией:
session.CreateCriteria(typeof(Customer))
.SetProjection( Projections.Max("Id") )
.UniqueResult();
Как описано Критерии Nhibernate: «выберите max (id) ...»
1
eepzable
23.05.2017 11:56:15