【发布时间】:2010-09-28 19:14:01
【问题描述】:
如何在不先在 LINQ 中选择数据的情况下更新记录?
由于您必须首先执行 linq select(显然调用 SQL SELECT,这很昂贵),因此更改所需的属性,然后执行 SubmitChanges()。我希望避免这种情况,只执行 SQL UPDATE,我已经知道 ID。
【问题讨论】:
标签: .net linq-to-sql .net-3.5
如何在不先在 LINQ 中选择数据的情况下更新记录?
由于您必须首先执行 linq select(显然调用 SQL SELECT,这很昂贵),因此更改所需的属性,然后执行 SubmitChanges()。我希望避免这种情况,只执行 SQL UPDATE,我已经知道 ID。
【问题讨论】:
标签: .net linq-to-sql .net-3.5
您需要使用Attach 方法将断开连接的实体“附加”到您的表中。 MSDN 上的这篇文章概述了如何使用它:
【讨论】:
我没试过,但看起来你可以用 Attach 来做到这一点:
Table(TEntity).Attach Method (TEntity, Boolean)
您将对象设置为更新状态并将其传入,将布尔参数设置为 true。当然,那么您必须设置所有字段,而不仅仅是您要更改的字段。
如果您只想更改一两个字段,您可以使用 DataContext 对象上的ExecuteCommand 和ExecuteQuery 方法直接调用 SQL。您必须将 SQL 作为字符串传递,并为 SQL 中的每个参数传递一个参数。请特别注意如何构造 SQL 字符串:
命令的语法差不多 与用于创建的语法相同 ADO.NET 数据命令。唯一的 区别在于参数如何 被指定。具体来说,你 通过将参数括起来来指定参数 在大括号 ({…}) 中并枚举它们 从1开始。参数为 与相同编号的相关联 参数数组中的对象。
【讨论】:
除非您将对象设置为使用乐观并发(我认为所有列都为 nocheck),否则这将很难做到。使用任何类型的并发,您都需要旧值和新值,至少对于检查的列是这样。或者,您可以为更新创建和映射 SQL 函数/存储过程,或者使用 ExecuteCommand 直接执行 SQL,正如@Kyralessa 所说。我认为 Detach/Attach 在配对时效果最好,即获取对象,分离它,使用它,然后在完成后重新附加并保存它。
【讨论】:
PLINQO 实现实体分离,并允许您从一个上下文中分离一个实体,然后将其重新附加到另一个上下文。它还能够直接执行更新和删除,而无需先检索实体。更多信息可以查看网站http://www.plinqo.com/
【讨论】: