我想解决这个问题:
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?
谢谢!
答案 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();