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

时间:2014-09-10 15:17:08

标签: c# sql nhibernate fluent-nhibernate

我想解决这个问题:

SELECT Max(Date)
FROM Table
GROUP BY SubId

(然后将其作为SubQuery传递给mid-action,这样我就可以获得表中项目的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是否有可能在没有选择的情况下将Groupy By a Property?

谢谢!

1 个答案:

答案 0 :(得分:1)

最后这样做,它生成了我想要的SQL。但它不是3个子查询,而是查看一组数据的3个查询(数组子查询和CorrespondingIds)。

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