Я сбрасываю таблицу из MySQL в объект DataTable, используя MySqlDataAdapter. Ввод и вывод базы данных преуспевают, но мой код приложения, похоже, имеет проблему с производительностью, которую я смог отслеживать для конкретного оператора LINQ.Медленная производительность LINQ в DataTable Where Clause?
Цель проста, найти содержимое DataTable для значения столбца, соответствующего конкретной строке, точно так же, как и традиционное предложение SQL WHERE column = 'text'
.
упрощенный код:
foreach (String someValue in someList) {
String searchCode = OutOfScopeFunction(someValue);
var results = emoteTable.AsEnumerable()
.Where(myRow => myRow.Field<String>("code") == searchCode)
.Take(1);
if (results.Any()) {
results.First()["columnname"] = 10;
}
}
Этот упрощенный код исполняется тысячи раз, один раз для каждой записи в someList
. Когда я запускаю Visual Studio Performance Profiler, я вижу, что строка «results.Any()
» подсвечивается как потребляющая 93,5% времени выполнения.
Я пробовал несколько различных методов для оптимизации этого кода, но ни один из них не улучшил производительность, сохранив в качестве основного источника данных DataTable emoteTable
. Я могу преобразовать emoteTable
в Dictionary<String, DataRow>
за пределы foreach, но тогда мне нужно синхронизировать DataTable и словарь, который, хотя и улучшает производительность, чувствует себя не так.
Три вопроса:
- Является ли это правильный способ поиска значения в DataTable (эквивалент традиционной SQL предложения WHERE)? Если нет, то как СЛЕДУЕТ это сделать?
- Добавление к 1, независимо от правильного пути, что является самым быстрым (время выполнения)?
- Почему линия
results.Any()
потребляет 90% + ресурсов? В этой ситуации имеет смысл, что линияvar results
должна потреблять ресурсы, ведь линия - это фактический поиск, верно?
Благодарим вас за внимание. Если я найду ответ, я также опубликую его здесь.
Почему вы используете .Where(). Возьмите (1), а затем результаты.Any()? Почему не 'var result = emoteTable.AsEnumerable(). FirstOrDefault (myRow => myRow.Field (" code ") == searchCode)'? Тогда вы можете просто проверить, является ли результат нулевым. –
john