在LINQ查询中删除多个记录的最佳方法?
使用LINQ一次性删除多个记录的最佳方法是什么?好的旧存储过程 您可以将存储过程拖到DBML文件中,它将在databasecontext类中生成一个丰富的方法在LINQ查询中删除多个记录的最佳方法?,linq,linq-to-sql,Linq,Linq To Sql,使用LINQ一次性删除多个记录的最佳方法是什么?好的旧存储过程 您可以将存储过程拖到DBML文件中,它将在databasecontext类中生成一个丰富的方法 使用Linq2Sql删除记录 CustomerDataContext ctx = new CustomerDataContext("connection string"); var customers = ctx.Customers.Where(c => c.Name == "david"); ctx.Customers.Dele
以下是LINQ to实体的更多信息,但可能会有所帮助:
也许现在回答这个问题有点晚了,但今天我自己遇到了这个问题,我和我提出了这个解决方案
CustomerDataContext ctx = new CustomerDataContext("connection string");
ctx.Customers.DeleteAllOnSubmit(ctx.Customers.Where(c => c.Name == "david"));
ctx.SubmitChanges();
我同意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);
}
使用实体框架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();
//数据库上下文
EntitiesContext db=新的EntitiesContext(connString);
//选择要删除的所有记录
IEnumerable list=db.entity.where(x=>x.id==id.toList();
//使用删除范围功能一次删除所有记录
db.entity.Removate(列表);
//保存更改
db.SaveChanges();
基于单个where子句删除多个记录
context.EntityModel
.RemoveAll(r => r.property == "propertyEntered");
但您也可以从数据库中删除列表中不存在的记录
编辑:
不确定wich更快,但您也可以用它进行第二次查询
.RemoveAll(r=>!listofBanRecords.Select(s=>s.propertyID)。Contains(w.propertyID))
Edit2:别忘了context.SaveChanges()代码>正如我在初稿中所做的以下是我解决问题的方法:
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;
}
试试看
{
List List=db.MaterialPartSerialNumbers.Where(s=>s.PartId==PartId&&s.InventoryLocationId==NewInventoryLocationId&&s.LocationId==LocationId).ToList();
db.MaterialPartSerialNumber.Removate(列表);
db.SaveChanges();
}
捕获(例外情况除外)
{
字符串错误=例如消息;
}
首先,您可以找到要删除的项目列表
然后,您可以使用函数RemoveRange(**list\u of\u item\u to\u delete**)
删除数据库中列表中的每个实例
根据MSDN,该方法从列表中删除一系列元素
有关更多信息,请检查此处这是我使用的,首先创建表的IENumerable对象,其中要删除的记录是,然后只使用RemoveRange,最后只保存对数据库的更改。假设您希望从products表上的一个特定供应商ID中删除所有产品,这就是您可以做到的方法
IEnumerable ProductsToRemove=db.Products.Where(x=>x.SupplierId==SupplierId);
db.Products.Removate(ProductsToRemove);
db.SaveChanges() 仅使用实体框架,我发现这是最紧凑的代码
db.PreperProperties.RemoveRange(db.PreperProperties.Where(c => c.preperFk == prpr.id));
db.SaveChanges();
这是最简单的方法之一,但我不会说这是最有效的方法。实际上没有进行任何优化。生成的SQL枚举与查询匹配的所有对象,然后手动迭代以删除它们。请参阅本文-无法将类型“System.Linq.IQueryable”隐式转换为“RajrangData.tblRelatedProduct”。存在显式转换(您是否缺少强制转换?您肯定不能在一个Customer
引用中存储多个Customer
对象……也许您需要这样的内容:List customers=ctx.customers.Where(c=>c.Name==“david”).ToList()当然,当你所做的一切都是从“最新流行的答案到<代码> DeleteAllOnSubmit < /Cord>方法时,你不能声称自己有了这个解决方案。”如果你需要做一些事情,比如“代码>删除”,从…………>代码中,那么考虑使用SQL。LINQ可能不是这个工作的最佳工具。让我们解释一下为什么它可以工作,而不是像回答那样只发布代码。它可以工作,因为我们正在向对象数据库传递一个属于该表的对象列表,所以函数RemoveRange可以用一行代码删除该列表中的所有对象。
db.PreperProperties.RemoveRange(db.PreperProperties.Where(c => c.preperFk == prpr.id));
db.SaveChanges();