实体框架:在LINQ查询中更新

Jam*_*mes 5 c# linq entity-framework

我遇到过更新LINQ查询中的表而不是先查询,并更新该查询返回的每个对象的想法.

例如,可以在此查询中更改与x关联的任何属性的值:

var Query = from x in EFContext.SomeTable
            where x.id == 1
            // SET X = Model or x.Name = "NewName"
            select SaveChanges();
Run Code Online (Sandbox Code Playgroud)

这样的事情可以完成吗?

Tra*_*ent 1

我相信最好的方法是编写一个扩展方法,可以通过创建一个静态类来完成:

public static class Extensions
{
    public static IEnumerable<T> Remove<T>(this DbSet<T> Input, Func<T, Boolean> Objects) where T : class
    {
        var I = Input.Where(Objects).ToList();
        for (int i = 0; i < I.Count; i++)
        {
            Input.Remove(I[i]);
        }
            return Input;
    }
    public static IEnumerable<T> Update<T>(this DbSet<T> Input, Func<T, Boolean> Objects, Action<T> UpdateAction) where T : class
    {
        var I = Input.Where(Objects).ToList();
        I.ForEach(UpdateAction);
        return I;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

var Context = new EFContext();
Context.YourTable.Remove(x=> x.Id == 1);
Context.SaveChanges();
// OR
Context.Update((x=> x.Id == 1), (y)=> {y.Title = "something"});
Context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

  • 你尝试过这段代码吗?它的效率非常低,因为它在每次迭代时都会进行计数。此外,过滤功能在*整个*集合被拖入内存后应用。如果值得为此创建扩展方法(我认为不值得),那么您至少应该解决这些问题。 (2认同)
  • 现在使用“Expression&lt;Func&lt;T, Boolean&gt;&gt; Objects”(最好是“selector”和“updateAction”,参数采用驼峰式大小写),然后我们就可以得到一些结果。 (2认同)