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

时间:2010-01-13 04:03:18

标签: 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>();   

1 个答案:

答案 0 :(得分: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);

这是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>();