我如何使用NHibernate从子查询中选择前X行
本文关键字:选择 查询 何使用 NHibernate | 更新日期: 2023-09-27 18:09:50
我的问题与我在StackOverflow上看到的其他问题略有不同,所以请不要将此与之前的答案混淆。
有一个查询
SELECT tab1.Id
FROM TABLE1 tab1
WHERE tab1.modified_date between to_date('01/04/2013 10:00:00', 'dd/mm/yyyy HH:MI:SS') and to_date('01/04/2013 11:15:00', 'dd/mm/yyyy HH:MI:SS')
GROUP BY tab1.Id
ORDER BY max(tab1.received_date) desc
我想选择前500行,因为Oracle在GROUP和ORDER BY条件(证据)之前处理where子句,我必须通过将这个查询包装在另一个查询中来选择前500行来实现这一点。
那么,现在我的查询看起来像…
SELECT *
FROM (SELECT tab1.Id
FROM TABLE1 tab1
WHERE tab1.modified_date between to_date('01/04/2013 10:00:00', 'dd/mm/yyyy HH:MI:SS') and to_date('01/04/2013 11:15:00', 'dd/mm/yyyy HH:MI:SS')
GROUP BY tab1.Id
ORDER BY max(tab1.received_date) desc ) sub
WHERE ROWNUM <=500
这一切都工作得很好,但我正在努力将其转换为使用QueryOver API的NHibernate查询。内部查询很简单,例如
var subquery = QueryOver.Of<Table1>()
.Select(Projections.Group<Table1>(e => e.Id))
.....where clause
.OrderBy(Projections.Max<Table1>(e => e.Received_Date)).Desc
但我如何包装这在一个select *从子查询rownum <= 500?
NHibernate知道如何创建一个正确的查询来选择前x行。
- HQL和普通SQL查询:
query.SetMaxResults(500)
. - QueryOver和Linq查询:
query.Take(500)
.
阻止我使用前面答案中建议的Take()方法的问题是由于我的语句中的ORDER BY部分。ORDER BY在Take()之后求值,这意味着返回了错误的500个结果。
我通过创建一个表示包含ORDER by子句的查询的视图来解决这个问题,然后在从视图中选择时,Take()方法按预期工作。