代码之家  ›  专栏  ›  技术社区  ›  Jader Dias

如何用linq to sql更新?

  •  13
  • Jader Dias  · 技术社区  · 15 年前

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

    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 回复  |  直到 15 年前
        1
  •  24
  •   Jacob Proffitt    15 年前

    是的,有一个简单的方法。简单得多。如果将实体附加到上下文,然后刷新(选中keepcurrentValues),则Linq to SQL将从服务器获取这些实体,对它们进行比较,并将更新的实体标记为不同的实体。您的代码看起来像这样。

    public static void Update(IEnumerable<Sample> samples
        , DataClassesDataContext db)
    {
        db.Samples.AttachAll(samples);
        db.Refresh(RefreshMode.KeepCurrentValues, samples)
        db.SubmitChanges();
    }
    

    在这种情况下,LinqtoSQL使用键来匹配和更新记录,只要您的键是同步的,就可以了。

        2
  •  7
  •   Thorarin    15 年前

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

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

    不过,我不完全确定这是否是您的预期问题:)

    *:有一些关于使用LINQ构建select语句并以某种方式将生成的select语句切碎为更新的黑客,但我不推荐这样做。