我必须使用实体框架更新包含大约 150,000 条记录的 Sql Server 表中的每一行。为了减少服务器的点击量,我想以 1000 行的单独批次执行此操作。我需要实体框架来:
- 从数据库中选择前 1000 行。
- 更新这些行。
- 调用 SaveChanges() 方法。
- 获取接下来的 1000 行。
- 重复。
实现这一目标的最佳方法是什么?
我正在使用实体框架 4 和 SQL Server 2012。
我必须使用实体框架更新包含大约 150,000 条记录的 Sql Server 表中的每一行。为了减少服务器的点击量,我想以 1000 行的单独批次执行此操作。我需要实体框架来:
实现这一目标的最佳方法是什么?
我正在使用实体框架 4 和 SQL Server 2012。
return query.Skip(HOW MUCH TO SKIP -AT THE BEGINNING WILL BE ZERO-)
.Take(HOW MUCH TO TAKE -THE NUMBER OF YOUR PAGING SIZE-).ToList();
如果您想在循环中执行此操作,可以执行以下操作:
int pagingIncrement = 1000;
for (int i = 0; i <= 150 000; i=i+pagingIncrement)
{
var query = your actual LINQ query.
var results = query.Skip(i).Take(pagingIncrement);
UpdatePartialResults(results);
}
注意:重要的是,在更新这些行时,不要在实际的 LINQ 查询中更新 ORDER BY 的条件,否则最终可能会一次又一次地更新相同的结果(因为重新排序)。
其他想法是使用之前给出的一些想法来扩展 IEnumerable 迭代器,例如 aSkip(counter).Take(pagingSize
和 yield result (有点异步处理)。
像这样的东西应该工作:
int skip =0;
int take = 1000;
for (int i = 0; i < 150; i++)
{
var rows = (from x in Context.Table
select x).OrderBy(x => x.id).Skip(skip).Take(take).ToList();
//do some update stuff with rows
skip += 1000;
}