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

Ali*_*air 6 nhibernate distinct

我有一个包含GLCode的表GL.我需要获取一个唯一的GLCode列表,但获取所有其他列.以下SQL生成我想要的结果.

select * from GL where GLId in (select Min(GLId) from GL group by GLCode )
Run Code Online (Sandbox Code Playgroud)

有没有办法使用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>();   
Run Code Online (Sandbox Code Playgroud)

Dan*_*ing 3

尽管 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);
Run Code Online (Sandbox Code Playgroud)

这是 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>();
Run Code Online (Sandbox Code Playgroud)