Эти Count()
подход может сделать дополнительную работу, поскольку (в TSQL) EXISTS
или TOP 1
часто намного более быстры; дб может оптимизировать, "там по крайней мере одна строка". Лично, я использовал бы любой/предикат перегрузку:
if (dc.Users.Any(u => u.Name == name)) {...}
, Конечно, можно сравнить то, что каждый делает путем наблюдения TSQL:
dc.Log = Console.Out;
Я не соглашаюсь, что выбор лучшего 1 будет всегда превосходить избранный счет по характеристикам для всех реализаций SQL. Это является все зависящим от реализации, Вы знаете. Любопытно, даже природа данных, хранивших в конкретной базе данных также, влияет на полный результат.
Позволяют нам исследовать их обоих способ, которым я реализовал бы их, если бы я должен был сделать так: Для обоих случаев проекция (оператор Where) оценка является общим шагом.
Затем для избранного лучшего 1, необходимо будет сделать чтение всех полей (если Вы действительно не выбирали лучший 1 'x', например: выберите лучший 1 1). Это будет функционально эквивалентно IQueryable. Любой (...)., за исключением того, что Вы проведете некоторое время, высвечиваясь в значении для каждого столбца первой записи, с которой встречаются, если БУДЕТ СУЩЕСТВОВАТЬ. Если ИЗБРАННЫЙ TOP найден в операторе, проекция является усечением, если нет никакой постпроекции proc (например, пункт ORDER BY). Это предварительно обрабатывает, несет маленькие расходы, но это - дополнительные расходы, если никакая запись действительно не существует, в этом случае, полный проект все еще сделан.
Для избранного количества, предварительно обрабатывание не сделано. Проекция сделана и если СУЩЕСТВУЕТ, ложь, результат мгновенен. Если СУЩЕСТВУЕТ, верно, количество все еще быстро, потому что это будет простой dW_Highest_Inclusive - dW_Lowest_Exclusive. Столь же быстрый как 500 - 26. Если существует, ложь, результатом является еще больше момента.
остающийся случай поэтому: Как быстро проекция и что Вы освобождаете путем выполнения полной проекции? И ответ приводит к наиболее важнейшей проблеме сюда, которая является: индексированное поле [NAME] или нет! Если у Вас будет индекс на [ИМЕНИ], то производительность любого запроса будет так близка, что это сводится к предпочтению разработчика.
В общем и целом, я просто запишу два - четыре запроса linq и произведу разницу во времени прежде и после.
Повторение все 4 с некластеризованным индексом на [ИМЕНИ];
Я думаю:
if (dc.Users.Any(u => u.Name == name)) {...}
лучший подход.