我必须使用实体框架更新Sql Server表中的每行约150,000条记录。为了减少服务器的命中数量,我想在1000行的单独批次中执行此操作。我需要实体框架来:如何使用C#和实体框架实现SQL Server分页?
- 从数据库中选择前1000行。
- 更新这些行。
- 调用SaveChanges()方法。
- 获取下一个1000行。
- 重复。
最好的方法是什么?
我使用实体框架4和SQL Server 2012的
我必须使用实体框架更新Sql Server表中的每行约150,000条记录。为了减少服务器的命中数量,我想在1000行的单独批次中执行此操作。我需要实体框架来:如何使用C#和实体框架实现SQL Server分页?
最好的方法是什么?
我使用实体框架4和SQL Server 2012的
这样的事情应该工作:
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;
}
这应该起作用。谢谢! – broke
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);
}
注意:重要的是,在更新这些行时,您不会更新ORDER的条件在你实际的LINQ查询中,否则你可能会一次又一次地更新相同的结果(因为重新排序)。
其他想法将扩展IEnumerable迭代器与一些以前给出的想法,如Skip(counter).Take(pagingSize
和yield结果(有待异步处理)。
你可以扩展这个吗?我不知道我将如何在一个循环内实现它。 – broke
@broke查看我的编辑。 –
这是否需要在交易发生呢? –
@ DanielA.White我不知道你的意思 – broke