如何使用NHibernate从子查询中选择前X行?

时间:2013-04-17 10:12:59

标签: c# oracle nhibernate queryover

我的问题与我在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

我想选择TOP 500行,并且因为Oracle在GROUP和ORDER BY条件(evidence)之前处理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 * from子查询中,其中rownum&lt; = 500?

2 个答案:

答案 0 :(得分:0)

NHibernate知道如何创建一个选择前x行的正确查询。

  • HQL和纯SQL查询:query.SetMaxResults(500)
  • QueryOver和Linq查询:query.Take(500)

答案 1 :(得分:0)

阻止我使用前面答案中建议的Take()方法的问题是由于我的语句的ORDER BY部分。在Take()之后正在评估ORDER BY,这意味着返回了错误的500个结果。

我通过创建一个表示包含ORDER BY子句的查询的视图解决了这个问题,然后从视图中选择时,Take()方法按预期工作。