Метод IEnumerable.Count () отнимает слишком много времени - PullRequest
0 голосов
/ 29 января 2020

Я сравниваю две таблицы данных, используя 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 с c до получения результата.

2. Позвольте мне объяснить, что такое бесценные правила или ограничения.

Спасибо ...

1 Ответ

1 голос
/ 29 января 2020

Вероятно, только кажется, что эта строка занимает так много времени из-за отложенного выполнения; когда вы вызываете Onlysource.Count (), он выполняет SourceDataRows, который выполняет SourceTargetJoin, который соединяет две таблицы и создает новый объект для каждой строки. Более 30 секунд могут быть разумными или даже быстрыми, в зависимости от механизма базы данных, количества строк и порядка индексации таблиц. Если вы хотите ускорить это, вы можете подумать об оптимизации вашей базы данных. Держу пари, что вы получите лучшую производительность, написав необходимый оператор SQL и выполнив его через Dapper или Ado. Net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...