我有父母的孩子关系,让我们说上课和孩子。每个孩子都属于一个班级,并且有一个年级。我需要选择每班最低等级的孩子(或孩子的ids)。
session.CreateCriteria(typeof(Classs))
.CreateAlias("Children", "children")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Min("children.Grade"))
.Add(Projections.GroupProperty("Id"))
)
.List<Object[]>();
此查询会返回每个班级的最低成绩,但我不知道哪个孩子获得了成绩。当我将孩子的Id添加到组中时,该组是错误的并且每个孩子都会被返回。
我希望我们能够在没有分组的情况下获得这些孩子的身份。如果这是不可能的,那么也许有办法用子查询来解决这个问题吗?
答案 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)
我现在无法测试,但你应该明白这个想法