【问题标题】:How to update with Linq-To-SQL?如何使用 Linq-To-SQL 进行更新?
【发布时间】:2009-08-12 21:36:49
【问题描述】:

我需要更新值,但我正在循环所有表值来执行此操作:

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

我确定上面的代码不是正确的方法,但我想不出其他方法。你能展示一个更好的方法吗?

【问题讨论】:

  • 您是否尝试从断开连接的实体更新连接的实体?
  • 是的,我正在尝试从断开连接的实体更新连接的实体

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


【解决方案1】:

是的,有一个更简单的方法。简单得多。如果您将实体附加到上下文,然后刷新(选择 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 使用键来匹配和更新记录,因此只要您的键同步,就可以了。

【讨论】:

  • 小语义更正,它不会“标记它们已更新”。它所做的是将每个属性的“原始值”替换为从数据库中读取的值。由于每个属性的“当前值”没有改变,SubmitChanges 将知道更新那些原始值(从服务器读取)与当前值(传入方法)不同的记录。
  • 仅供参考,这仅在样本是数据库中存在的子集时才有效。存在两个假设。 1. 没有人会从该表中删除您的示例枚举中存在的任何记录。 2. 因此,您的样本集合不能包含您添加的任何新条目。
【解决方案2】:

使用 Linq2Sql(或 Linq to Entities),如果不先完整检索记录,就无法*更新服务器上的记录,因此您所做的实际上是正确的。

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

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

*:有一些黑客使用 LINQ 构建 SELECT 语句并将生成的 SELECT 语句以某种方式转换为 UPDATE,但我不推荐它。

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多