【问题标题】:Best way to delete multiple records in a LINQ query?在 LINQ 查询中删除多条记录的最佳方法?
【发布时间】:2009-05-15 18:41:08
【问题描述】:

使用 LINQ 一次性删除多条记录的最佳方法是什么?

【问题讨论】:

  • 如果您需要执行类似DELETE FROM table WHERE ... 的操作,请考虑使用 SQL。 LINQ 可能不是这项工作的最佳工具。

标签: linq linq-to-sql


【解决方案1】:

使用 Linq2Sql 删除记录

CustomerDataContext ctx = new CustomerDataContext("连接字符串"); var customers = ctx.Customers.Where(c => c.Name == "david"); ctx.Customers.DeleteAllOnSubmit(客户); ctx.SubmitChanges();

【讨论】:

  • 这是最简单的方法之一,但我不会说是最有效的。实际上没有执行任何优化。生成的 SQL 会枚举与您的查询匹配的所有对象,然后手动迭代它们以删除它们。看到这篇文章 - stackoverflow.com/questions/869209/bulk-deleting-via-linq
  • 无法将类型“System.Linq.IQueryable”隐式转换为“RajrangData.tblRelatedProduct”。存在显式转换(您是否缺少演员表?
  • 当然你不能在一个Customer引用中存储多个Customer对象......也许你想要类似的东西:List<Customer> customers = ctx.Customers.Where(c => c.Name == "david").ToList();
【解决方案2】:

这是我解决问题的方法:

        try
        {
            List<MaterialPartSerialNumber> list = db.MaterialPartSerialNumbers.Where(s => s.PartId == PartId && s.InventoryLocationId == NewInventoryLocationId && s.LocationId == LocationId).ToList();
            db.MaterialPartSerialNumbers.RemoveRange(list);
            db.SaveChanges();
        }
        catch(Exception ex)
        {
            string error = ex.Message;
        }

首先,您可以找到要删除的项目列表。

然后,您可以使用函数RemoveRange(**list_of_item_to_delete**),以便删除数据库中存在的列表中的每个实例。

根据 MSDN,该方法从列表中删除一系列元素。

欲了解更多信息,请在此处查看https://msdn.microsoft.com/en-us/library/y33yd2b5(v=vs.110).aspx

【讨论】:

  • 请解释为什么它有效,不要只是发布代码作为答案
  • 之所以有效,是因为我们向对象数据库传递了属于该表的对象列表,因此函数 RemoveRange 可以使用 1 行代码删除该列表中的所有对象。
【解决方案3】:

好旧的 SPROC .....

您可以将 SPROC 拖到您的 DBML 文件中,它会在您的 databasecontext 类中生成一个丰富的方法。

【讨论】:

    【解决方案4】:

    使用实体框架6

    // Database context
    EntitiesContext db = new EntitiesContext(connString);
    // Select all the records to be deleted
    IEnumerable<entity> list = db.entity.where(x=>x.id == id).toList();
    // Use Remove Range function to delete all records at once
    db.entity.RemoveRange(list);
    // Save changes
    db.SaveChanges();
    

    【讨论】:

      【解决方案5】:

      基于单个 where 子句删除许多记录

      context.EntityModel
                  .RemoveAll(r => r.property == "propertyEntered");
      

      但您也可以从数据库中删除 List&lt;ListOfBadRecords&gt; 中不存在的记录

      context.EntityModel
                  .Where(w => w.propertyID == ID).ToList()
                  .RemoveAll(r => !ListOfBadRecords.Any(a => a.anyID == r.propertyID ));
      

      编辑:

      不确定哪个更快,但您也可以使用它进行第二次查询

      .RemoveAll(r =&gt; !ListOfBadRecords.Select(s=&gt;s.propertyID ).Contains(w.propertyID ))

      Edit2:不要忘记context.SaveChanges();,就像我在初稿中所做的那样

      【讨论】:

        【解决方案6】:

        以下内容更适用于 LINQ to Entities,但它可能会有所帮助:

        Bulk-deleting in LINQ to Entities

        【讨论】:

          【解决方案7】:

          这就是我使用的,首先创建要删除的记录所在的表的 IENumerable 对象,然后使用 RemoveRange,最后将更改保存到数据库。假设您想从 Products 表中的一个特定供应商 ID 中删除所有产品,您可以这样做。

          IEnumerable ProductsToRemove= db.Products.Where(x => x.SupplierId== Supplierid); db.Products.RemoveRange(ProductsToRemove); db.SaveChanges();

          【讨论】:

            【解决方案8】:

            也许这个答案有点晚了,但今天我自己遇到了这个要求,我和我想出了这个解决方案

            CustomerDataContext ctx = new CustomerDataContext("connection string");
            
            ctx.Customers.DeleteAllOnSubmit(ctx.Customers.Where(c => c.Name == "david"));
            
            ctx.SubmitChanges();
            

            【讨论】:

            • 当您所做的只是将cust 的声明从最流行的答案移至DeleteAllOnSubmit 方法时,您当然不能声称“想出了”该解决方案。
            【解决方案9】:

            我同意 Khurram 的观点,使用带有 LINQ 的简单存储过程来执行此操作会更有效(前提是您在 SQL 中有足够的权限来执行此操作)。我会用一个例子来扩充它。

            存储过程:

            CREATE PROCEDURE [dbo].[RemovePermissionsFromRole] 
            (
                @ROLE_ID int
            )
            AS
            BEGIN
                SET NOCOUNT ON;
            
                DELETE FROM [RolePermissions] WHERE [RoleID] = @ROLE_ID;
            END
            

            将存储过程从数据库资源管理器拖到 DBML 文件的方法窗格中。保存文件。在代码中:

            if (Request.QueryString["RoleID"] != null) {
                int roleID = Convert.ToInt32(Request.QueryString["RoleID"]);
            
                SETSDataContext context = new SETSDataContext();
                context.RemovePermissionsFromRole(roleID);
            }
            

            【讨论】:

              【解决方案10】:

              仅使用 Entity Framework,我发现这是最紧凑的代码。

              db.PreperProperties.RemoveRange(db.PreperProperties.Where(c => c.preperFk == prpr.id));
              db.SaveChanges();
              

              【讨论】:

                猜你喜欢
                • 2020-12-28
                • 1970-01-01
                • 2013-03-16
                • 2011-04-25
                • 1970-01-01
                • 2018-04-18
                • 1970-01-01
                • 2010-09-23
                • 1970-01-01
                相关资源
                最近更新 更多