首页 > 解决方案 > 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.让我解释一下什么是不可更改的规则或限制。

谢谢你...

标签: c#asp.net-mvclinqienumerable

解决方案


由于延迟执行,这可能只是看起来一行花费了这么多时间;当您调用 Onlysource.Count() 时,它正在执行 SourceDataRows,它正在执行 SourceTargetJoin,它正在连接两个表并为每一行创建一个新对象。30 多秒可能是合理的,甚至更快,具体取决于数据库引擎、行数以及表的索引方式。如果您想加快速度,您可能需要考虑优化您的数据库。我敢打赌,通过编写必要的 SQL 语句并通过 Dapper 或 Ado.Net 执行它,您会获得更好的性能。


推荐阅读