这个问题很可能是这个问题(因此需要实现对SQL Server 2008和实体框架的分页):
Offset/Fetch based paging (Implementation) in EntityFramework (Using LINQ) for SQL Server 2008
然而问题是我的数据库有超过100亿行。所以基本上Skip
不起作用,我需要一个接受“long”作为参数的Skip/Take
方法。使用Linq和EF的任何可能的解决方案?感谢
答案 0 :(得分:0)
好吧,如果有必要的话 - 期望在评论中你必须跳过数十亿才能只拿20个 - 尽可能多地阅读数据。
如果你想使用LINQ并且你有一个增量ID,你可以尝试一下 - 但它有点贵,它不会覆盖要检索的数据量的长值:
首次执行时,您必须确定int.MaxValue
- 1的ID。在那之后,您可以重新使用逻辑进行其余的分页。 (可能取决于旗帜)
使用ID作为where子句(下边框)并添加所需金额的Take
。从结果的最后一条记录中,您将保存下一个寻呼呼叫的ID,您将使用它而不是第一个确定的ID。
可能的方法代码(未经过测试)可能(不会覆盖您的所有案例而不做任何修改):
private long _lastId;
public IEnumerable<Students> GetPage(int toTake)
{
List<Students> result;
result = isFirstPage
? _context.Students
.Take(toTake)
.ToList();
: _context.Students
.Where(s => s.Id > _lastId)
.Take(toTake)
.ToList();
_lastId = result.LastOrDefault()?.Id ?? 0;
return result;
}