Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: AlistairОтветов: 1

У меня есть таблица 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>();
  • Я тоже сталкиваюсь с той же проблемой. Любая помощь? Bipul 08.07.2010

distinctnhibernate

Ответы

Ответ 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>();

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы