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

时间:2009-08-12 21:36:49

标签: c# .net linq linq-to-sql

我需要更新值,但我循环所有表值才能执行此操作:

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();
}

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

2 个答案:

答案 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,但我不推荐它。