如何在不选择属性的情况下生成Nhibernate GROUP BY
本文关键字:Nhibernate GROUP BY 情况下 选择 属性 | 更新日期: 2023-09-27 18:21:19
我想解决这个问题:
SELECT Max(Date)
FROM Table
GROUP BY SubId
(然后将其作为SubQuery传递到操作中期,这样我就可以获得表中项目的Id)
SELECT Id
FROM Table
WHERE Date in
[[[ previous request ]]]
(然后使用其他表联接获取完整的表项)
SELECT *
FROM Table
LEFT JOIN...
WHERE Id in
[[[ previous request ]]]
我尝试过这种请求:
var subquery = QueryOver.Of<Table>(() => x)
.SelectList(list => list
.SelectMax(() => x.Date)
.SelectGroup(() => x.Sub.Id)
);
var filter = QueryOver.Of<Table>().WithSubquery.
WhereExists(subquery)
.Select(p => p.Id);
var result = Session.QueryOver<Table>().WithSubquery.WhereProperty(p => p.Id).In(filter).Left.JoinQueryOver(p => p.Sub).List();
但问题是,只有请求的日期,我无法正确处理第一个请求。有比这种子查询更好的方法吗?在NHibernate有没有可能在不选择的情况下通过一个属性分组?
谢谢!
最后这样做了,它生成了我想要的SQL。但它并不是3个子查询——确切地说,它是在一组数据中查找的3个查询(数组子查询和相应的Id)。
var subquery = Session.QueryOver<Table>(() => x)
.SelectList(list => list
.SelectMax(() => x.Date)
.SelectGroup(() => x.Sub.Id))
.List<object[]>().Select(p => p[0]).ToArray();
var CorrespondingIds = Session.QueryOver<Table>(() => x)
.WhereRestrictionOn(() => x.Date).IsIn(subquery)
.Select(p => p.Id).List<int>().ToArray();
var result = Session.QueryOver<Table>(() => x).WhereRestrictionOn(() => x.Id).IsIn(CorrespondingIds).Left.JoinQueryOver(p => p.Sub).List();