【问题标题】:Batch Update From a LINQ Query?从 LINQ 查询批量更新?
【发布时间】:2014-03-05 22:08:08
【问题描述】:

现在我有一个应用程序,它一次处理一个数据库中的记录。

var records = from q in db.table 
              join j in db.OtherTable 
              where q.processed == 0 //Sample 
foreach(var record in records)
{
    //Do some stuff....

    db.ExecuteCommand("Update table set record.processed = 1 where id = record.ID");
}

在 foreach 结束时,它会更新已处理的记录。显然,因为 LINQ 在更新方面做得不好,所以我只执行了一个 executeCommand。现在要求此应用程序快速运行。现在,“做一些事情”只需不到一秒的时间运行数千行,它甚至使用 SqlBulkCopy 将记录插入到表中。

问题在于,当我输入代码以更新记录已处理时,它会显着减慢它。它必须更新数据库数千次。什么是更新我选择的所有记录(并且只更新我选择的记录)而不损失太多速度的更快方法。 (注意:如果整个过程完成后(在foreach之后)如果需要一点时间也可以)。

【问题讨论】:

  • 你能在 foreach 结束后更新 db 中的全部记录吗?或者您想在每次迭代中立即执行此操作?
  • 您是否真的更新了foreach 循环内表中的每条记录?是否有某种标识符可用于仅更新一条记录?
  • 为什么不通过调用SubmitChanges 更新您的实体?
  • 哈姆雷特,因为我没有选择实际的实体(在上面的上下文中名为 table 的类),我相信更新它没有好处。是 D,每条记录都需要更新它已经处理过,因为这个过程会立即再次运行,我不能选择相同的记录。在 foreach 结束时更新就可以了。
  • @KJ3 我的意思是您正在在每个循环中更新整个表格 - 您已更正。

标签: c# sql linq


【解决方案1】:

您可以根据列表中的 ID 生成 IN 语句:

string ids = string.Join(", ", records.Select(r => r.RecordID));
string sql = string.Format("Update table set record.processed = 1 WHERE RecordID IN ({0}) ", ids)
db.ExecuteCommand(sql);

【讨论】:

  • 我的错误,我在示例查询中省略了 where ID = record.ID。尽管如此,这是一个不错的解决方案,会试一试并报告。
  • 好的,我把答案的那一部分拿出来了。
  • 这正是我所需要的,运行效率非常高,并且不会使过程陷入困境。谢谢!不知道 string.join 函数
猜你喜欢
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2013-03-15
相关资源
最近更新 更多