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

Jad*_*ias 13 .net c# 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Jac*_*itt 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();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 仅供参考,这仅在样本是数据库中存在的内容的子集时才有效.存在两个假设.1.没有人会删除样本枚举中存在的此表中的任何记录.2.因此,您的样本集合不能包含您添加的任何新条目. (3认同)

Tho*_*rin 7

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

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

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

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