我需要更新值,但我循环所有表值才能执行此操作:
public static void Update(IEnumerable<Sample> 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();
}
我确信上面的代码不是正确的方法,但我还没想到其他任何方式。你能表现出更好的方式吗?
答案 0 :(得分:24)
是的,有一种更简单的方法。更简单。如果将实体附加到上下文然后刷新(选择了KeepCurrentValues),Linq to SQL将从服务器获取这些实体,比较它们,并标记更新的不同实体。你的代码看起来像这样。
public static void Update(IEnumerable<Sample> samples
, DataClassesDataContext db)
{
db.Samples.AttachAll(samples);
db.Refresh(RefreshMode.KeepCurrentValues, samples)
db.SubmitChanges();
}
在这种情况下,Linq to SQL正在使用键来匹配和更新记录,因此只要你的密钥同步,你就可以了。
答案 1 :(得分:7)
使用Linq2Sql(或Linq to Entities),没有办法*更新服务器上的记录而不先完全检索它们,所以你所做的实际上是正确的。
如果要避免这种情况,请编写一个可以执行所需操作的存储过程并将其添加到模型中。
我不完全确定这是否是你想要的问题:)
*:有一些hacks使用LINQ来构建一个SELECT语句并将生成的SELECT语句以某种方式进入UPDATE,但我不推荐它。