我需要更新值,但我循环中的所有表值做到这一点:
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();
}
我相信上面的代码是不这样做的正确的方式,但我想不出任何其他方式呢。 你能表现出更好的办法?
是的,有一个简单的方法。 要简单得多。 如果您将实体上下文,然后刷新(与选定KeepCurrentValues),LINQ到SQL将获得这些实体从服务器,对它们进行比较,并标记更新的那些不同。 您的代码会是这个样子。
public static void Update(IEnumerable<Sample> samples
, DataClassesDataContext db)
{
db.Samples.AttachAll(samples);
db.Refresh(RefreshMode.KeepCurrentValues, samples)
db.SubmitChanges();
}
在这种情况下,LINQ to SQL的使用键来匹配和更新记录,这样,只要你的钥匙都在同步,你的罚款。
随着LINQ2SQL(或LINQ到实体),没有办法*更新服务器上的记录,而不完全第一取回他们,所以你在做什么实际上是正确的。
如果你想避免这种情况,写一个存储过程,你想要什么,并把它添加到你的模型。
我不能完全肯定,如果这是你的预期问题,但:)
*:有一个围绕着使用LINQ建立一个SELECT语句并以某种方式屠宰产生的SELECT语句为UPDATE一些黑客,但我不会推荐它。