c# - IEnumerable.Count() 方法花费太多时间
问题描述
我正在使用 linq 比较两个数据表。
DataTable oSourceDataTable = DataBase.GetDatatable("Select * from Table1");// from Server one
DataTable oTargetDataTable= DataBase.GetDatatable("Select * from Table1");// from Server two
var SourceTargetJoin = from Source in oSourceDataTable.AsEnumerable()
join Target in oTargetDataTable.AsEnumerable()
on Source[sCompareWithKey] equals Target[sCompareWithKey]
select new { Source, Target };
var SourceDataRows = SourceTargetJoin.Select(m => m.Source);
var TargetDataRows = SourceTargetJoin.Select(m => m.Target);
var OnlySource = oSourceDataTable.AsEnumerable().Except(SourceDataRows, DataRowComparer.Default);
int iSourceCount = OnlySource.Count();// here Count() taking more than 30 sec for counting 1000 objects
var OnlyTarget = oTargetDataTable.AsEnumerable().Except(TargetDataRows, DataRowComparer.Default);
int iTargetCount = OnlyTarget.Count();// here Count() taking more than 30 sec for counting 500 objects
我的问题
1.Count() 或其他扩展方法(ToList()、CopyToDatatable()...)需要 30 多秒才能得到结果。
2.让我解释一下什么是不可更改的规则或限制。
谢谢你...
解决方案
由于延迟执行,这可能只是看起来一行花费了这么多时间;当您调用 Onlysource.Count() 时,它正在执行 SourceDataRows,它正在执行 SourceTargetJoin,它正在连接两个表并为每一行创建一个新对象。30 多秒可能是合理的,甚至更快,具体取决于数据库引擎、行数以及表的索引方式。如果您想加快速度,您可能需要考虑优化您的数据库。我敢打赌,通过编写必要的 SQL 语句并通过 Dapper 或 Ado.Net 执行它,您会获得更好的性能。
推荐阅读
- angular - Angular:多个下拉列表
- php - 哪种方法在服务器上保存拖放列表更有效;一个不断的ajax更新与手动保存按钮?
- excel - 用于存储和计算唯一 ID 出现次数的多维数组
- arrays - 在 MongoDB 中对对象数组中的项目使用 $rename
- asp.net-core - SignalR Core JS 客户端未在“升级”请求中传递授权标头
- javascript - 来自 lambda 函数的 API 网关的 502 内部服务器错误响应
- c# - 如何使用单输入文本框使用winform和socket编程c#将多个输入写入硬件?
- html - 让单选按钮标签在我检查后保持相同的颜色
- python - 在 python 中,有没有比 for 循环更快的方法来标记矩阵(3D 数组)?
- c# - 如何在这段代码中用 do-while 替换 while?