我正在迭代一组LINQ-to-SQL类的实例化。
在这次迭代中,我正在进行更改,标记一些删除,甚至在datacontext中插入新的。当我完成迭代时,我开火context.SubmitChanges()
- 它起作用,但它的速度非常慢。我在本地运行MSSQL 2008的快速版本。
另外,我注意到它生成的UPDATE语句,对于需要更新的行,它在所有字段/列上显示UPDATE SET ..... WHERE @p1 = ... AND @p2 = ...
。我已经在表中定义了主键,也在DBML模式中定义了主键,但它似乎仍然在UPDATE语句的所有列上进行比较,而不仅仅是主键。
有什么想法吗?
更新
正如我所担心的那样,这是因为我忘了在定义主键和表上必要的索引后更新LINQ-to-SQL模式。
有问题的卷大约有4万行,我对我的解决方案的性能非常满意。
如果卷应该上升,我将研究Marc所提到的并发检查属性。
答案 0 :(得分:2)
WHERE @p1 = ... AND @p2 =
与并发检查相关联。你可以禁用每列,或者(更好)使用时间戳/ rowversion(耶!)。查看dbml设计器中的“更新检查”和“时间戳”属性。将rowversion
添加到表中并将表重新导入dbml将是我的首选选项。
我们在这里谈论什么样的音量?数百?成千上万的?更?
LINQ-to-SQL(和EF)在逐个OO的基础上进行更改,因此逐行。除了基于集合的更新之外,还有一个限制,你需要编写一个存储过程来完成所有工作。
如果您没有进行大量更改,但仍需要很长时间,我预计问题是主键上缺少适当的索引。