Использовать переменную в предложении where, только если НЕ пусто? Этакий динамический пункт где? - PullRequest
6 голосов
/ 18 ноября 2010

Можно ли включить предложение в where (LINQ), но только если его "NOT" пусто?

т.е.

  where c.Code == sCode && p.Code == code

В этом случае переменная (стандартная c #) называется кодом ... если ее НЕ пусто, то выше, где здорово ... но если она пуста, я не хочу включать в нее, где

т.е.

  where c.Code == sCode

В SQL это сделано так

       AND ( ( @code = '' )
                  OR ( @code <> ''
                       AND C.Code = @code
                     )

Ответы [ 4 ]

10 голосов
/ 18 ноября 2010
where c.Code == sCode && (string.IsNullOrEmpty(code) || p.Code == code)

Это для стандартного LINQ, я понятия не имею, работает ли он для LINQ to SQL.

Редактировать: Это работает через оценку короткого замыкания

, еслиc.Code == sCode имеет значение false, он останавливает оценку и возвращает false
в противном случае, если string.IsNullOrEmpty(code) имеет значение true, он прекращает оценку и возвращает true
в противном случае возвращает p.Code == code

4 голосов
/ 18 ноября 2010

Поместите это в метод расширения IQueryable<T>, чтобы сделать его действительно простым:

public static IQueryable<Code> WithCodeIfNotEmpty(this IQueryable<Code> source, string code)
{
   if (string.IsNullOrEmpty(code))
      return source;
   else
      return source.Where(x => x.Code == code);
}

Использование:

var query = something.WithCodeIfNotEmpty("someCode");
3 голосов
/ 18 ноября 2010

Как утверждают другие:

(string.IsNullOrEmpty(code) || p.Code == code)

кстати sql можно оптимизировать до

   C.Code = isnull(ltrim(rtrim(@code)), c.Code)
0 голосов
/ 18 ноября 2010

Если вам нужна форма прямого перевода, которую вы дали TSQL, то это ответ

where
  code == "" ||
  (code != "" &&
  c.Code == code)
...