Условие Nhibernate Criteria Group By и выберите другие данные, которые не сгруппированы - PullRequest
2 голосов
/ 25 мая 2010

У меня есть отношения родитель-ребенок, скажем, класс и дети. Каждый ребенок принадлежит к классу и имеет оценку. Мне нужно выбрать детей (или идентификаторы детей) с наименьшей оценкой в ​​классе.

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

Этот запрос возвращает мне самую низкую оценку в классе, но я не знаю, какой ребенок получил оценку. Когда я добавляю идентификатор ребенка в группу, группа ошибается, и каждый ребенок возвращается.

Я надеялся, что мы сможем просто получить идентификаторы этих детей, не группируя их. Если это невозможно, то, возможно, есть способ решить эту проблему с помощью подзапросов?

1 Ответ

1 голос
/ 24 мая 2011

если минимальная оценка уникальна:

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)

Я не могу проверить это прямо сейчас, но вы должны понять

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...