2008-12-10 43 views
11

我們有一個查詢來選擇行取決於另一個值,即。最大。我不認爲這是真的有道理,所以這裏是查詢:當一個屬性等於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")); 

我的問題是,這是最好的方式?任何人都可以提出更好的方法?

+2

我認爲這是最好的辦法。 在SQL中,你會寫: SELECT e。* from e WHERE e.Property =(SELECT MAX(e2.Property)WHERE e2.EnquiryCode = e.EnquiryCode) 這就是你在HQL中所做的一切。 – 2008-12-12 15:19:43

+0

謝謝,這幫助我解決了類似的問題(即使你沒有答案!) – PandaWood 2011-03-18 06:18:37

回答

1

對於聚合,最好使用SQL而不使用HQL。使用Nhibernate僅適用於主要實體及其關係(非常可維護的設計)。存儲過程對於這些聚合和函數來說是更好的地方,因爲它們是數據相關的而不是對象依賴

0

我想,這一定工作:

(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>() 
相關問題