Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在LINQ查询中删除多个记录的最佳方法?_Linq_Linq To Sql - Fatal编程技术网

在LINQ查询中删除多个记录的最佳方法?

在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一次性删除多个记录的最佳方法是什么?

好的旧存储过程

您可以将存储过程拖到DBML文件中,它将在databasecontext类中生成一个丰富的方法


使用Linq2Sql删除记录

CustomerDataContext ctx = new CustomerDataContext("connection string"); var customers = ctx.Customers.Where(c => c.Name == "david"); ctx.Customers.DeleteAllOnSubmit(customers); ctx.SubmitChanges(); CustomerDataContext ctx=新CustomerDataContext(“连接字符串”); var customers=ctx.customers.Where(c=>c.Name==“david”); ctx.Customers.DeleteAllOnSubmit(客户); ctx.SubmitChanges();
以下是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();