4

有没有一种方法可以使用类似以下代码的代码对数据进行分页,而无需将整个数据集加载到程序中?

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

我正在尝试使用带有 LINQ 的存储过程来获得分页结果。(顺便说一句,上面的代码给出了“查询的结果不能多​​次枚举。”错误)。可能吗?

4

2 回答 2

2

目前无法使用实体框架进行测试,但常规 LINQ-to-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 应该与它相差不大。可能是错的。

于 2013-01-09T13:48:24.857 回答
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() 创造了魔力,代码可以毫无问题地工作!!

注意*:我知道这是很老的帖子,但我想帮助那些来这里寻求帮助的人!

于 2013-07-26T09:55:06.293 回答