2012-09-13 94 views
1

我必须使用实体框架更新Sql Server表中的每行约150,000条记录。为了减少服务器的命中数量,我想在1000行的单独批次中执行此操作。我需要实体框架来:如何使用C#和实体框架实现SQL Server分页?

  1. 从数据库中选择前1000行。
  2. 更新这些行。
  3. 调用SaveChanges()方法。
  4. 获取下一个1000行。
  5. 重复。

最好的方法是什么?

我使用实体框架4和SQL Server 2012的

+0

这是否需要在交易发生呢? –

+0

@ DanielA.White我不知道你的意思 – broke

回答

2

这样的事情应该工作:

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; 
} 
+0

这应该起作用。谢谢! – broke

4

使用LINQSkip & Take

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结果(有待异步处理)。

+0

你可以扩展这个吗?我不知道我将如何在一个循环内实现它。 – broke

+0

@broke查看我的编辑。 –