我已經實現了一個使用跳過和採取的分頁程序。它工作的很好,但我需要調用Take和Skip之前表中的記錄總數。LINQ:分頁技術,使用take和skip,但也需要全部記錄 - 如何實現?
我知道我可以提交2個單獨的查詢。
- 獲取計數
- 跳過和採取
但我寧願不要發出2調用LINQ。
如何在同一查詢中返回它(例如,使用嵌套select語句)?
以前,我在存儲過程中使用了分頁技術。我通過使用臨時表來返回項目,並將計數傳遞給輸出參數。
我已經實現了一個使用跳過和採取的分頁程序。它工作的很好,但我需要調用Take和Skip之前表中的記錄總數。LINQ:分頁技術,使用take和skip,但也需要全部記錄 - 如何實現?
我知道我可以提交2個單獨的查詢。
但我寧願不要發出2調用LINQ。
如何在同一查詢中返回它(例如,使用嵌套select語句)?
以前,我在存儲過程中使用了分頁技術。我通過使用臨時表來返回項目,並將計數傳遞給輸出參數。
對不起,但你不能。至少,不是一個漂亮的方式。
你能做到這一點在unpretty方式,但我不認爲你這樣的:
你明白嗎?根本不漂亮。
沒有理由做兩個單獨的查詢甚至存儲過程。完成後,使用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
}
);
這仍然是對數據庫的兩個查詢。它只是看起來像一個查詢,如果你在LINQ查詢中眯得夠緊。 ;-) – Enigmativity 2010-11-25 10:59:24
事實上,這段代碼實際上根本不會導致數據庫查詢。只有當你遍歷`pagedQuery`時,數據庫纔會被調用。它也依賴於LINQ提供程序,但是一個好的提供程序會將其作爲單個數據庫查詢運行。某些提供程序可能執行N + 1個查詢。此外,執行兩個單獨的查詢(一個計數和一個結果查詢)可能會比這個更好。正如我所說,這不太好。 – Steven 2010-11-25 11:06:34