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() 还是循环?一般来说,对数据库的任何迭代更新都将花费大量时间,并且它是您循环优化存储过程的地方之一 @PhillipHToList()
正在抓紧时间。
【参考方案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”调用并没有什么害处,但我怀疑是否会观察到任何严重的性能改进。您可以随时尝试两者,看看它们的效果如何? 不知道tempSS
和SDetails
是否代表数据库调用。 OP 没有提供足够的信息。以上是关于Linq 更新需要很长时间来处理的主要内容,如果未能解决你的问题,请参考以下文章
Android MediaPlayer 需要很长时间来准备和缓冲