IQueryable.Skip和IQueryable.Take Upper Bound

时间:2016-10-28 07:02:43

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

我正在使用Entity Framework来查询数据库,我使用以下内容:

context
    .MyTable
    .Where(...)
    .Where(...)
    .OrderBy(...)
    .Skip((int)numberOfItemsToSkip)
    .Take((int)numberOfItemsToTake)
    .ToArray();

我的问题是Skip((int)numberOfItemsToSkip)部分。它只接受Int32参数,其上限为Int32.MaxValue。现在,如果MyTable包含的内容超过Int32.MaxValue,该怎么办?我说这个的原因是因为我拥有的数据库是巨大的并且大幅增长,这就是为什么我遇到Int32.MaxValue可能不够的情况。我的数据库托管在SQL Server上。

那么,有没有内置的方法来传递Int64参数呢?我可以继续做一些手动操作,但我的问题是关于实体框架内的内容。

1 个答案:

答案 0 :(得分:1)

您可以尝试多次重复Skip

context
    .MyTable
    .Where(...)
    .Where(...)
    .OrderBy(...)//you forgot it
    .Skip(numberOfItemsToSkip1)
    .Skip(numberOfItemsToSkip2)
    .Take(numberOfItemsToTake)
    .ToArray();

结果SQL(EF 6.1.3,SQL Server 2012):

SELECT *
    FROM [dbo].[Table]
    WHERE ....
    ORDER BY ...
    OFFSET numberOfItemsToSkip1 + numberOfItemsToSkip2 ROWS FETCH NEXT numberOfItemsToTake ROWS ONLY