有没有办法可以使用类似下面的代码来分页数据,而无需将整个数据集加载到程序中?
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 :(得分: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()制作了魔法,代码可以正常运行!!
注意*:我知道这篇文章非常古老,但想到帮助那些会来这里寻求帮助的人!