У меня есть таблица GL, содержащая GLCode. Мне нужно получить список уникальных GL-кодов, но получить все остальные столбцы. Следующий SQL дает нужные мне результаты.
select * from GL where GLId in (select Min(GLId) from GL group by GLCode )
Есть ли способ сделать это с помощью Criteria API?
Это моя лучшая попытка:
var subQuery = DetachedCriteria.For<GL>();
subQuery
.SetProjection(Projections.Property("GLCode"))
.SetResultTransformer(new DistinctRootEntityResultTransformer());
return (List<GL>)currentSession
.CreateCriteria(typeof(GL))
.Add(Subqueries.PropertyIn("GLCode", subQuery))
.List<GL>();
Ответ 1 · рейтинг 3 · Daniel Schilling
Несмотря на то, что в NHibernate нет способа исключить GLCode из столбцов результатов подзапроса, все же можно создать запрос, который выполняет эту работу. Используйте коррелированный подзапрос EXISTS вместо IN. SQL, который мы ищем, выглядит следующим образом:
select query.*
from GL query
where exists (
select
min(subquery.GLId) AS GLId,
subquery.GLCode
from GL subquery
group by subquery.GLCode
having min(subquery.GLId) = query.GLId);
А вот запрос NHibernate:
var min = Projections.Min("GLId");
var subquery = DetachedCriteria.For<GL>("subquery")
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("GLCode"), "GLCode")
.Add(min, "GLId"))
.Add(Restrictions.EqProperty(min, "query.GLId"));
return session.CreateCriteria<GL>("query")
.Add(Subqueries.Exists(subquery))
.List<GL>();