Linq 更新需要很长时间来处理

Posted

技术标签:

【中文标题】Linq 更新需要很长时间来处理【英文标题】:Linq Update taking long time to process 【发布时间】:2016-05-18 09:55:30 【问题描述】:

因为我的代码需要很长时间才能处理。我分析了代码并搜索了需要大量时间的代码部分。

在我的listTempInOut 中有超过 100000 条记录。 SDetails 也有更多记录。我想update模型中的2个字段。所以下面是代码:-

var dataUpd = (from A in tempSS
                               from B in SDetails
                               from C in listTempInOut
                               where A.Id == B.Id
                               && A.Shift == B.Shift && A.Employee == C.Employee && A.SDate == C.Time_Date1
                               select new  A.SId, B.Status, C ).ToList();
                foreach (var row in dataUpd)
                
                    row.C.Time_Field1 = row.ShiftId;
                    row.C.Time_Field2 = row.Status.ToString();
                

把上面代码中的change can i do改成improve the performance,这样代码的执行时间就更少了。

【问题讨论】:

“1 lac 记录”?? @Slugart: 1 lac 是一个测量/计数单位 -> wiki,虽然肯定不是 SI,甚至不是英制 :) 如果您的表结构允许,您可能会通过使用连接获得更好的性能 这两行中哪一行花时间? ToList() 还是循环?一般来说,对数据库的任何迭代更新都将花费大量时间,并且它是您循环优化存储过程的地方之一 @PhillipH ToList() 正在抓紧时间。 【参考方案1】:

实体框架中的更新可能非常慢,请尝试在您的上下文中将 AutoDetectChangesEnabled 属性设置为 false(请参阅下面的代码,我不确定您的上下文实际称为什么,因此我将其称为“myContext”)。完成更新后,您必须记住将其设置回 true,因此我建议您将代码包装在 try/finally 块中。

        try
        
            myContext.Configuration.AutoDetectChangesEnabled = false;
            var dataUpd = (from A in tempSS
                           from B in SDetails
                           from C in listTempInOut
                           where A.Id == B.Id
                           && A.Shift == B.Shift && A.Employee == C.Employee && A.SDate == C.Time_Date1
                           select new  A.SId, B.Status, C ).ToList();
            foreach (var row in dataUpd)
            
                row.C.Time_Field1 = row.ShiftId;
                row.C.Time_Field2 = row.Status.ToString();
            
        
        finally
        
            myContext.Configuration.AutoDetectChangesEnabled = true;
        

【讨论】:

OP 说 ToList 是罪魁祸首。 .ToList 枚举查询并从数据库中获取数据,但无论如何,只要您尝试在 foreach 循环中遍历您的集合,就会发生这种情况。删除“toList”调用并没有什么害处,但我怀疑是否会观察到任何严重的性能改进。您可以随时尝试两者,看看它们的效果如何? 不知道tempSSSDetails是否代表数据库调用。 OP 没有提供足够的信息。

以上是关于Linq 更新需要很长时间来处理的主要内容,如果未能解决你的问题,请参考以下文章

结果集需要很长时间来处理来自 Oracle 的大数据

PLSQL 块需要很长时间来声明游标

Android MediaPlayer 需要很长时间来准备和缓冲

简单的 MySQL 查询需要很长时间来计算

为什么phpMyAdmin需要很长时间来显示查询,但是显示查询执行得很快? [关闭]

避免花很长时间来完成“牛奶过多”的场景