2010-11-17 42 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)