2010-11-25 35 views
4

我已經實現了一個使用跳過和採取的分頁程序。它工作的很好,但我需要調用Take和Skip之前表中的記錄總數。LINQ:分頁技術,使用take和skip,但也需要全部記錄 - 如何實現?

我知道我可以提交2個單獨的查詢。

  1. 獲取計數
  2. 跳過和採取

但我寧願不要發出2調用LINQ。

如何在同一查詢中返回它(例如,使用嵌套select語句)?

以前,我在存儲過程中使用了分頁技術。我通過使用臨時表來返回項目,並將計數傳遞給輸出參數。

回答

8

對不起,但你不能。至少,不是一個漂亮的方式。

你能做到這一點在unpretty方式,但我不認爲你這樣的:

你明白嗎?根本不漂亮。

+4

這仍然是對數據庫的兩個查詢。它只是看起來像一個查詢,如果你在LINQ查詢中眯得夠緊。 ;-) – Enigmativity 2010-11-25 10:59:24

+3

事實上,這段代碼實際上根本不會導致數據庫查詢。只有當你遍歷`pagedQuery`時,數據庫纔會被調用。它也依賴於LINQ提供程序,但是一個好的提供程序會將其作爲單個數據庫查詢運行。某些提供程序可能執行N + 1個查詢。此外,執行兩個單獨的查詢(一個計數和一個結果查詢)可能會比這個更好。正如我所說,這不太好。 – Steven 2010-11-25 11:06:34

0

沒有理由做兩個單獨的查詢甚至存儲過程。完成後,使用let綁定來記錄子查詢,您可以使用包含所選項目以及總數的匿名類型。一個查詢到數據庫,1個linq表達式和你完成的。 TO獲取值將是jobQuery.Select(x => x.item)或jobQuery.FirstOrDefault()。計數

讓表達式是一件了不起的事情。

var jobQuery = (
       from job in jc.Jobs 
       let jobCount = (
            from j in jc.Jobs 
            where j.CustomerNumber.Equals(CustomerNumber) 
            select 
             j 
           ).Count() 
       where job.CustomerNumber.Equals(CustomerNumber) 
       select 
       new 
       { 
        item = job.OrderBy(x => x.FieldName).Skip(0).Take(100), 
        Count = jobCount 
       } 
      );