1

要更新列表项,请使用以下代码:

foreach (MyObject obj in listObj)
  {
      // modify fields              
      obj.myProperty = value; //any value
      objRepository.Modify(obj);
  }
contex.SubmitChanges();

问题是该列表包含超过 5000 条记录,并且处理过程非常缓慢。有什么方法可以更快地更新它?直接用sql?

谢谢您的帮助。

4

3 回答 3

1

在我看来有两种可能:

  1. 在 SQL 中实现存储过程,并通过与数据库的直接连接直接访问它。很难在没有任何代码的情况下为您提供任何详细的帮助,但您绝对应该从 sp 中挤出比 LINQ to SQL 循环更多的性能,因为该语句是提前准备好的,只要您只创建一次连接即可真正做的是将数据传递给服务器并让服务器处理其余的事情。

  2. 另一种选择是修改您的存储库以接受缓存大小作为可能的参数。也就是说,您告诉存储库仅在其内存中有给定数量的记录时才影响对数据库的更改,或者每 x 毫秒一次,以较早的时间为准。这有点像 StringBuilder 的工作方式,在您开始使用 StringBuilder 以提高性能之前,您可以让 StringBuilder 了解要保留多少空间。

于 2012-08-03T21:01:58.497 回答
1

有一篇古老但很棒的文章展示了如何使用 linq2sql 执行批量更新

http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx

于 2012-08-03T20:50:49.587 回答
1

如果您使用的是数据库,则性能下降是由 5000 多次往返数据库来保存更改造成的。每次往返都可能很昂贵。保存这些更改的最佳选择是将它们批量化,EF 为您执行此操作(我假设这就是您正在使用的)。

如果您可以使用单个 SQL 语句识别列表中的对象,则存储过程可能是更新该数据的最快方法。但是,如果您之后不刷新对象,您将面临对象缓存与底层数据库不同步的风险。使用实体框架,您可以将存储的过程导入到您的上下文中,并直接调用它。

另一个选项是您编写的 - foreach 循环。如果它是您编写的东西,而不是生成的东西,我会仔细研究分析您的存储库类的 Modify 方法。

这可能是性能需求可能超过模型纯度的情况之一。根据我的经验,EF 和其他 ORM 框架非常适合单独处理对象和小型集合,但是我发现在处理中到大型数据集合(只有数百条记录)时,卸载基于集合的数据变得更加高效处理数据库,让数据库引擎做它被优化的事情。我们正在谈论将运行时间从几分钟减少到几秒钟。

祝你好运!

于 2012-08-03T20:53:31.530 回答