Просто потому, что это возможно, не означает, что вы должен. Использование @variable IS NULL OR @ variable = field
(или, что еще хуже, с использованием оператора IN
) - это в значительной степени верный способ снижения производительности.
Использование явного IF заявления и отдельные ВЫБИРАЕТ в T-SQL, и приравненных отдельных выражений запросов в LINQ:
IF (@ID IS NULL and @TypeID IS NO NULL)
SELECT ... FROM CARS WHERE ...
ELSE IF (@ID IS NOT NULL AND @TypeID IS NULL)
SELECT ... FROM CARS WHERE ...
ELSE IF (@ID IS NOT NULL AND @TypeID IS NOT NULL)
SELECT ...
Проблема с попыткой построить одну единственную ВЫБРАТЬ, который удовлетворяет различным условиям в зависимости от @variable параметров что SQL stil должен построить один запрос план покрытия все возможно комбинация. В большинстве случаев этот план будет самым худшим планом, который выполняет полное сканирование таблицы. Даже когда план каким-то образом оптимизирован, он будет оптимизирован для значений @variable на момент создания плана (из-за parameter sniffing), и этот план будет работать даже хуже, чем тривиальный план, когда @variables имеют разные значения при последующем выполнении.
BTW ваш ИНЕКЕ не имеют каких-либо условий на автомобили, вы либо собираетесь выбрать все или никто. Вы уверены, что не '(@ID NULL) ИЛИ (Cars.ID IN (SELECT ...))'? –