通过Linq从数据库中删除很慢

Mav*_*415 0 c# linq database linq-to-entities

我在c#中删除了一个应用程序,我利用linq to entities它在我的应用程序中构建查询.但是我发现我的应用程序在添加和删除记录时非常慢.删除500条记录大约需要15分钟.那太久了.我的删除查询如下.

public void deletePayrollBatch(int batchNo) 
{
          var context = new DataSources.sspEntities();
          var query1 = (from a in context.Payroll_Details
                        where a.Payroll_BatchBatch_no == batchNo
                        select a).ToList();

           foreach (var x in query1) 
           {
                context.DeleteObject(x);
                context.SaveChanges();
           }
}
Run Code Online (Sandbox Code Playgroud)

我的查询相当简单.一行数据确实包含大约20列.我不知道这是否会产生影响.无论如何,如果我能得到一些专家建议,那将会有所帮助.谢谢.

编辑.

基于删除,我已经有了很好的建议.其中之一是context.SaveChanges()在循环之外使用.在我的插入中,我有类似的代码(如下所示),但我需要首先保存记录,因为我希望ID在另一个函数中使用它.在这种情况下,我该怎么办?

foreach (var xyz in x)
{
   Try{
          pDetails1.EstateID = 143;
          pDetails1.Employee_Personal_InfoEmp_id = xyz.PD_EmpPersonal_Id;
          pDetails1.PAYE = (decimal)xyz.PD_PAYE.GetValueOrDefault();
          pDetails1.PAYE_YTD = (decimal)PayeYTD.GetValueOrDefault();
          pDetails1.Basic_Pay = (decimal)xyz.PD_BasicPay.GetValueOrDefault();
          pDetails1.Basic_Pay_YTD = (decimal)basicpay_YTD.GetValueOrDefault();
          pDetails1.Gross_Pay = (decimal)xyz.PD_GrossPay.GetValueOrDefault();
          pDetails1.Gross_Pay_YTD = (decimal)GrossPay_YTD.GetValueOrDefault();

          context.SaveChanges();
          Functions.RandomFunct rf = new RandomFunct();
          rf.AdditionalEarningsIsContinuous(xyz.PD_EmpPersonal_Id); // I NEED THE ID IN ORDER TO RUN THIS FUNCTION. IN THIS CASE I HAVE TO SAVE ON EACH ELEMENT IN THE FOR EACH LOOP??

    }
    catch (exeception e)
        debug.writeline(e.message);
    }
Run Code Online (Sandbox Code Playgroud)

Hab*_*bib 7

你正在呼唤context.SaveChanges每一条记录.你可以在foreach循环结束时执行一次.

foreach (var x in query1)
{
   context.DeleteObject(x);
}
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

这将把删除一次的请求发送到数据库以获取所有记录.目前,您正在发送DELETE每条记录的请求,这需要时间.

  • @ Maverick1415而且......为什么`ToList()`?保持`IEnumerable <T>`并且对象不会全部加载到内存中的列表中.LINQ**甚至可以**优化你的查询只执行`DELETE Payroll_Details WHERE Payroll_BatchBatch_no == batchNo`而不是'DELETE Payroll_Details WHERE ID IN(SELECT ID from Payroll_Details WHERE Payroll_BatchBatch_no == batchNo) (4认同)