Nhibernate Criteria Group By子句并选择未分组的其他数据

时间:2010-05-25 18:55:02

标签: nhibernate criteria

我有父母的孩子关系,让我们说上课和孩子。每个孩子都属于一个班级,并且有一个年级。我需要选择每班最低等级的孩子(或孩子的ids)。

session.CreateCriteria(typeof(Classs))
 .CreateAlias("Children", "children")
 .SetProjection(Projections.ProjectionList()
     .Add(Projections.Min("children.Grade"))
     .Add(Projections.GroupProperty("Id"))
 )
 .List<Object[]>();

此查询会返回每个班级的最低成绩,但我不知道哪个孩子获得了成绩。当我将孩子的Id添加到组中时,该组是错误的并且每个孩子都会被返回。

我希望我们能够在没有分组的情况下获得这些孩子的身份。如果这是不可能的,那么也许有办法用子查询来解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

如果最低等级是唯一的:

select (select id from child c where c.classs_id = classs.id and c.grade = Min(classs.grade)) as child_id, classs.id from classs join child group by classs.id

翻译成标准

subquery = detachedCriteria.For<Child>("this")
  .Add(Restrictions.EqProperty("this.Classs", "classs.Id"))
  .Add(Restrictions.EqProperty("this.Grade", Projections.Min("classs.Grade")))
  .SetProjection(Projections.Id())


session.CreateCriteria(typeof(Classs), "classs")
  .CreateAlias("Children", "children")
  .SetProjection(Projections.ProjectionList()
     .Add(Projections.Alias(Projections.SubQuery(subquery)), "child_id")
     .Add(Projections.GroupProperty("Id"))
  )
  .List<object[]>()     // contains child_id and id (classs)

我现在无法测试,但你应该明白这个想法