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

时间:2014-03-14 15:15:37

标签: c# database linq 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();
           }
}

我的查询相当简单。一行数据确实包含大约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);
    }

1 个答案:

答案 0 :(得分:7)

您正在为每条记录调用context.SaveChanges。您可以在foreach循环结束时执行此操作。

foreach (var x in query1)
{
   context.DeleteObject(x);
}
context.SaveChanges();

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