NHibernate:根据列获取不同的结果,但检索所有列

标签 nhibernate distinct

我有一个包含 GLCode 的表 GL。我需要获取唯一 GLCode 的列表,但需要获取所有其他列。下面的 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>();   

最佳答案

尽管 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>();

关于NHibernate:根据列获取不同的结果,但检索所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2054309/

相关文章:

nhibernate - QueryOver 或与子查询

Wcf NHibernate session 管理

c# - 通过 slug 获取内容项的正确方法

c# - 使用 System.Data.OracleClient 配置 Fluent NHibernate

postgresql - 如何使用最大字段获得不同的结果

node.js - MongoDB 和 NodeJS 中的全文搜索,并以不同值进行文本评分排序

MYSQL 问题如何计数导致主表不包括连接中使用的详细表 "labels"中的所有行

mysql - 从 mysql 查询中获取不同的记录

mysql - NHibernate MySQL 密码函数

MySQL COUNT 记录在 GROUP BY 之前