如何使用C#和实体框架实现SQL Server分页?

时间:2012-09-13 18:01:47

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

我必须使用实体框架更新Sql Server表中的每一行约150,000条记录。为了减少服务器的命中量,我想在1000行的不同批次中执行此操作。我需要实体框架:

  1. 从数据库中选择前1000行。
  2. 更新这些行。
  3. 调用SaveChanges()方法。
  4. 获取下一行1000行。
  5. 重复。
  6. 实现这一目标的最佳途径是什么?

    我正在使用实体框架4和SQL Server 2012.

2 个答案:

答案 0 :(得分:4)

使用LINQ Skip& 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);
}

注意:重要的是,在更新这些行时,您不会在实际的LINQ查询中更新ORDER BY的条件,否则您可能会一次又一次地更新相同的结果(因为重新排序)。

其他想法是使用一些先前给出的想法扩展IEnumerable迭代器,例如Skip(counter).Take(pagingSize和yield结果(以异步方式处理)。

答案 1 :(得分: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;
}