如何在Linq中运行批量更新/删除查询?

时间:2009-12-23 12:58:13

标签: c# .net linq linq-to-sql

我有2个Linq2Sql类:ParentChild。我想做一些事情,比如删除父母的所有孩子,或更新所有子记录。在SQL中我会写:

delete Child where ParentID = @p

update Child set Val = Val+1 where ParentID = @p

我可以在Linq中以Parent类内部的强力方式执行此操作:

Children.ToList().ForEach(c => c.DeleteOnSubmit()); // DeleteOnSubmit is my own method

Children.ToList().ForEach(c => c.Val++);

但鉴于Linq对ForEach循环的固有性能损失,这似乎是一种非常低效的方法。是否有某种方法可以实现所需的结束,只会触发一个查询?

5 个答案:

答案 0 :(得分:14)

对于这些情况,您可以使用DataContext.ExecuteCommand method直接在数据库上执行SQL。例如:

dataContext.ExecuteCommand("delete Child where ParentID = {0}", parentId);

答案 1 :(得分:9)

答案 2 :(得分:2)

使用linq查看http://magiq.codeplex.com群发操作。

答案 3 :(得分:1)

更新和删除

实体框架的当前限制是,为了更新或删除实体,您必须首先将其检索到内存中。此外,对于单个删除,必须先检索该对象,然后才能删除该对象,从而需要对数据库进行两次调用。为了克服这个问题,我们必须使用EntityFramework.Extended扩展当前的实体框架。 EntityFramework.Extended具有有用的功能,如批量更新和删除,审核日志,查询结果缓存,未来查询。批量更新和删除消除了在修改实体之前检索和加载实体的需要。以下是几行代码,用于演示如何删除,更新。

通过nuget安装

<强> PM&GT; Install-Package EntityFramework.Extended

<强>更新

场景:更新拥有美国国家/地区的客户。 如果我们在没有任何扩展的情况下执行此操作,我们必须获取具有country USA的所有客户,修改列表并使用循环更新它。使用Entity Framework.Exdended我们不需要获取客户列表,只需添加where条件,设置更新数据和执行查询。

static void Main(string[] args)   
{   
    using(var db = new DataContext())   
    {   
        db.Customers.Where(c => c.Country == "USA").Update(c => new Customer()   
        {   
            Country = "IN"   
        });   

        foreach(var customer in db.Customers.ToList())    
        {   
            Console.WriteLine("CustomerInfo - {0}-{1}-{2}", customer.Name, customer.Country, customer.Status);   
        }   
    }   

    Console.ReadLine();   
}

https://code.msdn.microsoft.com/entity-framework-batch-994cd739

答案 4 :(得分:-1)

试试这个

_db.tblStockAllocationEurails.Where(t => t.StockNo >= From && t.StockNo <= To).ToList().ForEach(t => t.StatusID = NewGuid);
_db.SaveChanges();