Часто подобные вещи легче писать, используя свободный синтаксис, а не синтаксис запроса.
, например
IQueryable query = dataContext.Staffs;
if(name1 != null)
{
query = query.Where(x => x.name == name1);
}
Так что, если name1
равно нулю, вы просто не делаете Where()
вызов. Если у вас есть несколько разных фильтров, каждый из которых может или не может потребоваться, и, возможно, различные разные порядки сортировки, я считаю, что это становится намного более управляемым.
Редактировать для alex: Хорошо, я отвечал на вопрос о добавлении предложения where только тогда, когда значение не равно нулю. В ответ на другую часть вопроса я попробовал это с Entity Framework 4, чтобы увидеть, какой SQL генерирует LINQ. Вы делаете это путем приведения query
к ObjectQuery
и вызова .ToTraceString()
. В результате предложение WHERE
получилось следующим образом:
WHERE @p__linq__0 IS NULL OR [Extent1].[name] = @p__linq__1
Так что, да, это классический плохой SQL, если у вас есть индекс в столбце name
, не ожидайте его использования.
Edit # 2: Попробовал еще раз, используя LINQ to SQL, а не Entity Framework, с довольно разными результатами. На этот раз попытка запроса со значением name1
, равным нулю, вообще не приводит к предложению WHERE
, как вы надеетесь; попытка сделать это с name1
, являющимся "a", привела к простым WHERE [t0].[name] = @p0
и @p0
, отправленным как "a". Entity Framework, похоже, оптимизирует , а не . Это немного беспокоит.