如何在不选择属性的情况下生成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有没有可能在不选择的情况下通过一个属性分组?

谢谢!

如何在不选择属性的情况下生成Nhibernate GROUP BY

最后这样做了,它生成了我想要的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();