【问题标题】:How to implement SQL Server paging using C# and entity framework?如何使用 C# 和实体框架实现 SQL Server 分页?
【发布时间】:2012-09-13 18:01:46
【问题描述】:

我必须使用实体框架更新包含大约 150,000 条记录的 Sql Server 表中的每一行。为了减少服务器的点击量,我想以 1000 行的单独批次执行此操作。我需要实体框架来:

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

实现这一目标的最佳方法是什么?

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

【问题讨论】:

  • 这需要在事务中发生吗?
  • @DanielA.White 我不确定你的意思

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


【解决方案1】:

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

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

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

【讨论】:

  • 你能扩展一下吗?我不确定如何在循环中实现它。
【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多