SQL Server 2008 Skip Take with long parameter

时间:2018-03-27 13:08:56

标签: c# entity-framework linq sql-server-2008-r2

这个问题很可能是这个问题(因此需要实现对SQL Server 2008和实体框架的分页):

Offset/Fetch based paging (Implementation) in EntityFramework (Using LINQ) for SQL Server 2008

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

1 个答案:

答案 0 :(得分:0)

好吧,如果有必要的话 - 期望在评论中你必须跳过数十亿才能只拿20个 - 尽可能多地阅读数据。

  • 您可以使用一个存储过程来获取要跳过的金额 取。
  • 另一种方法是在dbContext的数据库属性上执行纯SQL。

如果你想使用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;
}