在存储过程中使用LINQ进行分页?

时间:2012-09-18 08:08:47

标签: linq entity-framework stored-procedures pagedlist

有没有办法可以使用类似下面的代码来分页数据,而无需将整个数据集加载到程序中?

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

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

2 个答案:

答案 0 :(得分:2)

目前无法使用Entity Framework进行测试,但常规的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应该与它不同。可能是错的。

答案 1 :(得分: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()制作了魔法,代码可以正常运行!!

注意*:我知道这篇文章非常古老,但想到帮助那些会来这里寻求帮助的人!