簡體   English   中英

如何使用NHibernate從子查詢中選擇前X行?

[英]How do I select top X rows from a sub query using NHibernate?

我的問題與我在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條件( 證據 )之前處理了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

但是如何將其包裝在rownum <= 500的子查詢中的select *中呢?

NHibernate知道如何創建一個正確的查詢來選擇前x行。

  • HQL和普通SQL查詢: query.SetMaxResults(500)
  • QueryOver和Linq查詢: query.Take(500)

導致我無法使用先前答案中建議的Take()方法的問題是由於語句的ORDER BY部分引起的。 在Take()之后正在評估ORDER BY,這意味着將返回錯誤的500個結果。

我通過創建一個表示包含ORDER BY子句的查詢的視圖來解決此問題,然后從視圖中進行選擇時Take()方法將按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM