如何使用Linq-To-SQL进行更新?

我需要更新值,但我循环所有表值来做到这一点:

public static void Update(IEnumerable samples , DataClassesDataContext db) { foreach (var sample in db.Samples) { var matches = samples.Where(a => a.Id == sample.Id); if(matches.Any()) { var match = matches.First(); match.SomeColumn = sample.SomeColumn; } } db.SubmitChanges(); } 

我确信上面的代码不是正确的方法,但我还没想到其他任何方式。 你能表现出更好的方式吗?

是的,有一种更简单的方法。 更简单。 如果将实体附加到上下文然后刷新(选择了KeepCurrentValues),Linq to SQL将从服务器获取这些实体,比较它们,并标记更新的不同实体。 你的代码看起来像这样。

 public static void Update(IEnumerable samples , DataClassesDataContext db) { db.Samples.AttachAll(samples); db.Refresh(RefreshMode.KeepCurrentValues, samples) db.SubmitChanges(); } 

在这种情况下,Linq to SQL正在使用键来匹配和更新记录,因此只要你的密钥同步,你就可以了。

使用Linq2Sql(或Linq to Entities),没有办法*更新服务器上的记录而不先完全检索它们,所以你所做的实际上是正确的。

如果要避免这种情况,请编写执行所需操作的存储过程并将其添加到模型中。

我不完全确定这是不是你想要的问题:)

*:有一些hacks使用LINQ来构建一个SELECT语句并将生成的SELECT语句以某种方式进入UPDATE,但我不推荐它。