IEnumerable.Count()方法花费太多时间

问题描述 投票:0回答:1

我正在使用linq比较两个DataTable。

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-mvc linq ienumerable
1个回答
1
投票

[似乎只因延迟执行而导致一行花费大量时间;当您调用Onlysource.Count()时,它正在执行SourceDataRows,后者正在执行SourceTargetJoin,后者将连接两个表并为每一行创建一个新对象。 30秒钟以上可能是合理的甚至更快的时间,具体取决于数据库引擎,行数以及如何对表建立索引。如果要加快速度,则可能需要考虑优化数据库。我敢打赌,通过编写必要的SQL语句并通过Dapper或Ado.Net执行它,您会获得更好的性能。

© www.soinside.com 2019 - 2024. All rights reserved.