当属性等于Max with NHibernate时选择对象

时间:2008-12-10 15:57:30

标签: c# 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"));

我的问题是,这是最好的方法吗?任何人都可以提出更好的方法吗?

3 个答案:

答案 0 :(得分:1)

对于聚合,最好使用SQL而不是HQL。使用Nhibernate仅用于主要实体及其关系(非常易于维护的设计)。存储过程是这些聚合和函数的更好位置,因为它们是数据相关的而不是对象依赖的

答案 1 :(得分:1)

你应该可以通过投影来做到这一点:

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

如上所述Nhibernate Criteria: 'select max(id)...'

答案 2 :(得分: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>()