LINQ 将选择和更新查询组合在一起

本文关键字:查询 组合 在一起 更新 选择 LINQ | 更新日期: 2023-09-27 17:56:32

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

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

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

LINQ 将选择和更新查询组合在一起

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

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

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

您可以手动为更新操作生成 sql 查询,然后通过SqlQuery方法执行它,或者也可以根据需要使用实体框架执行Stored Procedures

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