要更新列表项,请使用以下代码:
foreach (MyObject obj in listObj)
{
// modify fields
obj.myProperty = value; //any value
objRepository.Modify(obj);
}
contex.SubmitChanges();
问题是此列表包含超过5000条记录,而且过程非常缓慢。有一种方法可以更快地更新它吗?直接用sql?
感谢您的帮助。
答案 0 :(得分:1)
有一篇陈旧但很棒的文章,展示了如何执行linq2sql批量更新
http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx
答案 1 :(得分:1)
如果您使用的是数据库,那么您的数据库往返5000次以保存更改会导致性能下降。每次往返都很昂贵。保存这些更改的最佳选择是批量处理,EF为您做的(我假设您正在使用它)。
如果您可以使用单个SQL语句识别列表中的对象,则存储过程可能是更新该数据的最快方法。但是,如果之后不刷新对象,则会冒着对象缓存与底层数据库不同步的风险。使用Entity Framework,您可以将存储的proc导入到您的上下文中,并直接调用它。
另一个选项是你写的 - foreach循环。我会仔细研究一下您的存储库类的Modify方法,如果它是您编写的内容,而不是生成的内容。
这可能是性能需求可能超出模型纯度的情况之一。根据我的经验,EF和其他ORM框架非常适合处理单个对象和小型集合,但是我发现在处理中到大型数据集合(只有数百条记录)时,卸载基于集合的数据变得更加高效处理数据库,让数据库引擎完成它的优化。我们正在谈论将运行时间从几分钟缩短到几秒钟。
祝你好运!
答案 2 :(得分:1)
我认为有两种可能性:
在SQL中实现存储过程,并通过与数据库的直接连接直接访问它。很难在没有任何代码的情况下给你任何详细的帮助,但你绝对应该从s.p.中挤出更多的性能。而不是LINQ to SQL循环,因为该语句是提前准备的,只要你只是创建连接,只要你真正做的就是将数据传递给服务器并让服务器处理其余部分。
另一种选择是修改存储库以接受缓存大小作为可能的参数。也就是说,您告诉存储库只有在数据库内存中有给定数量的记录时才会影响数据库的更改,或者每x毫秒一次就会更快地对数据库进行更改。这有点像StringBuilder的工作方式,因为您可以在开始使用它来提高性能之前让StringBuilder了解要预留多少空间。