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)
尽管 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)
| 归档时间: |
|
| 查看次数: |
2111 次 |
| 最近记录: |