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;
}
这个问题很可能是这个问题(所以需要用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;
}