LINQ合并选择和更新查询

nxagd54h  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(127)

我有一个LINQ数据库操作,如下所示:

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

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

        TheDC.SubmitChanges();  
    }
}

正如您所看到的,我正在阅读一个列表,然后我正在更新这个列表,最后我正在将它写回到DB中。有没有办法将这个操作合并到一个查询中呢?

0s0u357o

0s0u357o1#

是否有办法将此操作合并到一个查询中?
在Linq中不是这样--如果更新有模式,您可以直接执行一条SQL语句,但是查询和更新是两种不同的方法。

yiytaume

yiytaume2#

不,你应该继续使用一个简单的循环来操作你的对象。在LINQ中没有更新的方法。顾名思义:* 语言集成查询*,LINQ用于查询,不用于更新
您可以为更新操作手动生成sql查询,然后通过SqlQuery方法执行它,或者如果愿意,也可以使用Entity Framework执行Stored Procedures

qv7cva1a

qv7cva1a3#

实际上并没有一个update select语句,但是您可以缩短代码并删除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();
}

相关问题