2009-12-22 61 views
2

當分頁數據時,我不僅要返回10個結果,而且還希望獲得所有頁面中的項目總數。單個調用中的多個結果

如何在一次調用中獲得總計數和頁面結果?

我的分頁方法是:

公共IList的GetByCategoryId(INT的categoryId,詮釋FIRSTRESULT,INT的maxResults) {

 IList<Article> articles = Session.CreateQuery(
      "select a from Article as a join a.Categories c where c.ID = :ID") 
      .SetInt32("ID", categoryId) 
      .SetFirstResult(firstResult) 
      .SetMaxResults(maxResults) 
      .List<Article>(); 



     return articles; 
    } 
+0

我試過去也有類似的東西,但最終打了2個電話。檢查總數的呼叫相對'輕',所以對我來說很好。 – 2009-12-22 15:29:42

回答

2

的事實是,你讓兩個電話。但是在大多數數據庫中count(*)調用非常非常便宜,而當您在主調用之後執行調用時,查詢緩存有時會提供幫助。

你的計數器調用通常會有點不同,它實際上並不需要使用內部連接纔有意義。還有一些小小的性能調整,但大多數時候你不需要它們。

1

我相信你其實可以做你所要求的。您可以在代碼中一次性檢索計數和頁面,但不能在一條SQL語句中進行檢索。實際上,兩個查詢被髮送到數據庫,但是在一次往返中,結果被檢索爲2個元素的數組。其中一個元素是總數作爲一個整數,第二個是您檢索到的實體的IList。

有兩種方法做到這一點:

  • MultyQuery
  • 多目標

下面是從下面的鏈接抽取的樣本:

IList results = s.CreateMultiQuery() 
     .Add("from Item i where i.Id > :id") 
     .Add("select count(*) from Item i where i.Id > :id") 
     .SetInt32("id", 50) 
     .List(); 

IList items = (IList)results[0]; 
long count = (long)((IList)results[1])[0]; 

下面是詳細信息關於你如何做到這一點。它非常簡單。

http://ayende.com/Blog/archive/2006/12/05/NHibernateMutliQuerySupport.aspx http://ayende.com/Blog/archive/2007/05/20/NHibernate-Multi-Criteria.aspx

如果你讀你上面的兩篇文章會看到有使用這種方法,增加了價值,做尋呼與MultiQuery用戶多了反正更加透明和清晰的方式反對的性能增益傳統的方式。

1

請注意,NHibernate的最新版本支持期貨的想法,所以你可以做。

var items = s.CreateQuery("from Item i where i.Id > :id") 
     .SetInt32("id", 50) 
     .Future<Item>(); 

var count = s.CreateQuery("select count(*) from Item i where i.Id > :id") 
     .SetInt32("id", 50) 
     .FutureValue<long>(); 

這是一個更自然的語法,它仍然會導致一個數據庫查詢。 你可以在這裏閱讀更多關於它的信息: http://ayende.com/Blog/archive/2009/04/27/nhibernate-futures.aspx