2010-11-17 58 views
6

是否可以在where(LINQ)中包含一个子句,但只有在其“NOT”为空时才可以包含该子句?仅在非空的情况下在where子句中使用变量?一种动态的where子句?

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

在这种情况下,变量(标准C#)被称为代码...如果它不是空的,则以上地方是伟大的..但如果为空的话,我不想包括在它的地方

​​

在SQL它做这样

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

回答

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

这对标准的LINQ,我不知道它是否适合LINQ到SQL。

编辑: 这是通过short circuit evaluation

如果c.Code == sCode是假的,它停止评估并返回false
否则,如果string.IsNullOrEmpty(code)是真实的,它停止评估并返回true
否则,返回p.Code == code

+0

你得到了!错误的方式aroun .....哦,等待你改变它。 :) – RPM1984 2010-11-17 22:48:42

+2

(隐形编辑)= D – Greg 2010-11-17 22:50:14

+0

哈哈忍者风格,得爱如何“编辑”不出现,除非它在5分钟左右回答问题。 – RPM1984 2010-11-17 22:51:04

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"); 
3

如其他人所述:

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

顺便说一句SQL可以优化

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

Thanks Preet ..这是非常好的和简单的解决方案,我面临的问题。我自己问了一个帖子,人们只是回答DLinq和ext方法..我想要的只是你的解决方案.. – lawphotog 2013-06-07 09:25:22

0

如果您希望您TSQL给出一个直接的翻译形式那么这就是答案

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