【发布时间】:2009-05-15 18:41:08
【问题描述】:
使用 LINQ 一次性删除多条记录的最佳方法是什么?
【问题讨论】:
-
如果您需要执行类似
DELETE FROM table WHERE ...的操作,请考虑使用 SQL。 LINQ 可能不是这项工作的最佳工具。
标签: linq linq-to-sql
使用 LINQ 一次性删除多条记录的最佳方法是什么?
【问题讨论】:
DELETE FROM table WHERE ... 的操作,请考虑使用 SQL。 LINQ 可能不是这项工作的最佳工具。
标签: linq linq-to-sql
使用 Linq2Sql 删除记录
CustomerDataContext ctx = new CustomerDataContext("连接字符串"); var customers = ctx.Customers.Where(c => c.Name == "david"); ctx.Customers.DeleteAllOnSubmit(客户); ctx.SubmitChanges();【讨论】:
Customer引用中存储多个Customer对象......也许你想要类似的东西:List<Customer> customers = ctx.Customers.Where(c => c.Name == "david").ToList();
这是我解决问题的方法:
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
【讨论】:
好旧的 SPROC .....
您可以将 SPROC 拖到您的 DBML 文件中,它会在您的 databasecontext 类中生成一个丰富的方法。
【讨论】:
使用实体框架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();
【讨论】:
基于单个 where 子句删除许多记录
context.EntityModel
.RemoveAll(r => r.property == "propertyEntered");
但您也可以从数据库中删除 List<ListOfBadRecords> 中不存在的记录
context.EntityModel
.Where(w => w.propertyID == ID).ToList()
.RemoveAll(r => !ListOfBadRecords.Any(a => a.anyID == r.propertyID ));
编辑:
不确定哪个更快,但您也可以使用它进行第二次查询
.RemoveAll(r => !ListOfBadRecords.Select(s=>s.propertyID ).Contains(w.propertyID ))
Edit2:不要忘记context.SaveChanges();,就像我在初稿中所做的那样
【讨论】:
以下内容更适用于 LINQ to Entities,但它可能会有所帮助:
【讨论】:
这就是我使用的,首先创建要删除的记录所在的表的 IENumerable 对象,然后使用 RemoveRange,最后将更改保存到数据库。假设您想从 Products 表中的一个特定供应商 ID 中删除所有产品,您可以这样做。
IEnumerable ProductsToRemove= db.Products.Where(x => x.SupplierId== Supplierid); db.Products.RemoveRange(ProductsToRemove); db.SaveChanges();
【讨论】:
也许这个答案有点晚了,但今天我自己遇到了这个要求,我和我想出了这个解决方案
CustomerDataContext ctx = new CustomerDataContext("connection string");
ctx.Customers.DeleteAllOnSubmit(ctx.Customers.Where(c => c.Name == "david"));
ctx.SubmitChanges();
【讨论】:
cust 的声明从最流行的答案移至DeleteAllOnSubmit 方法时,您当然不能声称“想出了”该解决方案。
我同意 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);
}
【讨论】:
仅使用 Entity Framework,我发现这是最紧凑的代码。
db.PreperProperties.RemoveRange(db.PreperProperties.Where(c => c.preperFk == prpr.id));
db.SaveChanges();
【讨论】: