Я запустил профилировщик в моем приложении .NET winforms (скомпилировано с .NET 4.7.1), и он указывает на следующую функцию, которая потребляет 73% процессорного времени моего приложения, что кажется слишком большим для простогослужебная функция:
public static bool DoesRecordExist(string keyColumn1, string keyColumn2, string keyColumn3,
string keyValue1, string keyValue2, string keyValue3, DataTable dt)
{
if (dt != null && dt.Rows.Count > 0) {
bool exists = dt.AsEnumerable()
.Where(r =>
string.Equals(SafeTrim(r[keyColumn1]), keyValue1, StringComparison.CurrentCultureIgnoreCase) &&
string.Equals(SafeTrim(r[keyColumn2]), keyValue2, StringComparison.CurrentCultureIgnoreCase) &&
string.Equals(SafeTrim(r[keyColumn3]), keyValue3, StringComparison.CurrentCultureIgnoreCase)
)
.Any();
return exists;
} else {
return false;
}
}
Цель этой функции - передать имена некоторых ключевых столбцов и соответствующие им значения ключей и проверить, существует ли какая-либо соответствующая запись в памяти c # DataTable
.
Мое приложение обрабатывает сотни тысяч записей, и для каждой записи эта функция должна вызываться несколько раз.Приложение выполняет много вставок, и перед любой вставкой оно должно проверить, существует ли эта запись в базе данных.Я подумал, что проверка в памяти по DataTable
будет намного быстрее, чем каждый раз возвращаться к физической базе данных, поэтому я делаю эту проверку в памяти.Каждый раз, когда я делаю вставку в базу данных, я делаю соответствующую вставку в DataTable
, чтобы последующие проверки того, существует ли запись, будут точными.
Итак, на мой вопрос: Есть либолее быстрый подход? (я не думаю, что смогу избежать проверки на наличие записей каждый раз, иначе у меня останутся дублирующие вставки и нарушения ключа.)
РЕДАКТИРОВАТЬ # 1 В дополнение к попыткам поступивших предложений, которые я сейчас пытаюсь сделать, мне пришло в голову, что, возможно, мне также следует выполнить .AsEnumerable()
только один раз и передать EnumerableRowCollection<DataRow>
вместо DataTable
.Как вы думаете, это поможет?
РЕДАКТИРОВАТЬ # 2 Я только что провел контролируемый тест и обнаружил, что запрос к базе данных напрямую, чтобы увидеть, существует ли запись, значительно медленнее чем поиск в памяти.