仅在非空的情况下才在where子句中使用变量?一种动态where子句?

时间:2010-11-17 22:32:58

标签: linq dynamic where-clause

是否可以在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 个答案:

答案 0 :(得分:10)

where c.Code == sCode && (string.IsNullOrEmpty(code) || p.Code == code)

这是标准的LINQ,我不知道它是否适用于LINQ to SQL。

编辑: 这适用于short circuit evaluation

如果c.Code == sCode为false,则停止评估并返回false 否则,如果string.IsNullOrEmpty(code)为真,则停止评估并返回true 否则,请返回p.Code == code

答案 1 :(得分:4)

将其放在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");

答案 2 :(得分:3)

正如其他人所说:

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

btw sql可以优化到

   C.Code = isnull(ltrim(rtrim(@code)), c.Code)

答案 3 :(得分:0)

如果您想要直接翻译表格,那么您给出的TSQL就是答案

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