2008-12-10 45 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>() 
相关问题