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