NHibernate: получить отдельные результаты на основе столбца, но получить все столбцы

У меня есть таблица 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>();   

person Alistair    schedule 13.01.2010    source источник
comment
Я тоже сталкиваюсь с той же проблемой. Любая помощь?   -  person Bipul    schedule 08.07.2010


Ответы (1)


Несмотря на то, что в 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>();
person Daniel Schilling    schedule 07.05.2011
comment
Очень нравится пример sql перед ответом nhibernate. - person ctrlplusb; 19.06.2012