2012-09-18 85 views
4

有沒有一種方法可以使用類似下面的代碼來分頁數據,而無需將整個數據集加載到程序中?使用LINQ進行分頁存儲過程?

var r = from c in entities.GetSearchData(null,"en",null,true) select c; 
IPagedList<Models.SearchResult> results = r.ToPagedList<Models.SearchResult>(1, 10); 

我想用LINQ獲取分頁結果的存儲過程。 (順便說一句,上面的代碼給出了「查詢的結果不能一次枚舉」的錯誤)。可能嗎?

+0

對於不止一次枚舉的錯誤:您可以使用r.ToList()枚舉多次。您也可以使用Linq來使用Take(),Skip()擴展方法來獲取特定的數據集,這樣,如果您願意,您也可以省略使用存儲過程。 – 2012-09-18 08:13:16

+0

但如果我使用ToList()數據將在分頁之前加載。我需要在沒有加載整套的情況下做到這一點。 –

+4

您的存儲過程是否接受分頁參數?分頁必須由存儲過程在內部完成。 –

回答

2

與實體框架目前無法測試,但經常LINQ到SQL允許以下語句:

var rpage1 = entities.GetSearchData(null,"en",null,true).Skip(0).Take(10) 
var rpage2 = entities.GetSearchData(null,"en",null,true).Skip(10).Take(10) 
var rlist = rpage1.ToList(); 

LINQ會產生像

WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1 

的條款在我的案例得到的查詢是(GetConstantsValues是一個存儲過程):

SELECT [t1].[value] AS [Value] 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[value]) AS [ROW_NUMBER], [t0].[value] 
    FROM [dbo].[GetConstantsValues](@p0) AS [t0] 
    ) AS [t1] 
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2 
ORDER BY [t1].[ROW_NUMBER] 

所以只有相關的結果被加載到程序中。

我認爲,EF應該沒有多大差別。可能是錯的。

1

無需返回LINQ to SQL。有一個你可以做的調整。對於實體框架,存儲過程的結果是ObjectSet的集合,因此除非將其轉換爲普通的可枚舉集合,否則枚舉不會被允許超過一次。對付這種情況

簡單的方法是如下,

var r = from c in entities.GetSearchData(null,"en",null,true) select c; 
IPagedList<Models.SearchResult> results = 
    r.ToList().ToPagedList<Models.SearchResult>(1, 10); 

這裏r.ToList()使魔法,代碼將沒有任何的毛病工作!

注意*:我知道這是很舊的帖子,但想到幫助那些會來這裏尋求幫助的人!

+0

歡迎來到堆棧溢出!您不需要在帖子中添加簽名 - 您的用戶卡會自動添加。閱讀[幫助](http://stackoverflow.com/help/behavior)瞭解更多詳情。 – Artemix

+0

提示:將文本格式化爲代碼 - 在該行之前添加四個空格。 – Artemix