linq结合选择和更新查询

时间:2014-04-03 16:32:00

标签: c# .net linq

我有一个linq DB操作,如下所示:

using (SomeDC TheDC = new SomeDC())
{   
    var SomeData = (from .... select x).ToList();

    if (SomeData.Count() > 0)
    {
        foreach (.... in SomeData) { x.SomeProp = NewProp; }

        TheDC.SubmitChanges();  
    }
}

正如您所看到的,我正在阅读列表,然后我正在更新此列表,最后我将其写回数据库。有没有办法在一个查询中组合此操作?

感谢。

3 个答案:

答案 0 :(得分:3)

  

有没有办法在一个查询中合并此操作?

不在Linq中 - 如果有更新模式,您可以直接执行一个SQL语句,但查询和更新是两种不同的方法。

答案 1 :(得分:2)

不,你应该继续使用一个简单的循环来操纵你的对象。LINQ中没有更新的方法。顾名思义:语言集成查询 LINQ用于查询而不是更新。

您可以手动为更新操作生成sql查询,然后通过SqlQuery方法执行它,或者如果您愿意,也可以使用Entity Framework执行Stored Procedures

答案 2 :(得分:0)

实际上并不存在单个更新选择语句,但您可以缩短代码并放弃ToList()调用。

另外,计算检查是不必要的,因为foreach无论如何都不会为空循环操作。

using (SomeDC TheDC = new SomeDC())
{   
    var SomeData = (from .... select x);
    foreach (.... in SomeData) { x.SomeProp = NewProp; }
    TheDC.SubmitChanges();  
}

或者,如果您只是想在一次执行中执行此操作,则可以使用自己的扩展方法来提供帮助。

public static class DatabaseHelper {

  public static void Apply<T>(this IEnumerable<T> collection, Action<T> action) {
     if (collection == null) { // Sanity check
        return;
     }
     foreach (var item in collection) {
        action(item);
     }
  }
}

然后你的代码将是

using (SomeDC TheDC = new SomeDC()) {
  (from ... select x).Apply(x => x.SomeProp = NewProp);
  TheDC.SubmitChanges();
}