SQL Server 2008 跳过带长参数的 Take

SQL Server 2008 Skip Take with long parameter

这个问题很可能是这个问题(所以需要用SQL Server 2008和Entity Framework实现分页):

但是问题是我的数据库有超过 100 亿行。所以基本上 Skip 不起作用,我需要一个接受 "long" 作为参数的 Skip/Take 方法。 Linq 和 EF 有任何可能的解决方案吗?谢谢

好吧,如果有必要的话 - 预计评论中的情况,你必须跳过数十亿只需要 20 - 读取尽可能多的数据。

  • 您可以使用一个存储过程来获取要跳过的数量并
  • 另一种方法是在 dbContext 的数据库 属性.
  • 上执行普通的 SQL

如果你想使用 LINQ 并且你有增量 ID,你可以尝试一下 - 但它有点贵,而且它不会覆盖要检索的数据量的 long 值:

第一次执行你必须确定int.MaxValue-1的ID。在那之后,您可以 re-use 其余分页的逻辑。 (也许取决于标志) 使用 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;
}