2010-11-17 16 views
6

E 'possibile includere una clausola nel dove (LINQ) ma solo se il suo "NOT" è vuoto?Usa la variabile in where clausola solo se NOT vuoto? Una sorta di clausola in cui dinamica?

cioè

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

In questo caso la variabile (di serie C#) è chiamato codice ... se non è vuoto, allora quanto sopra, dove è grande .. ma se il suo vuoto, allora io non voglio includere in essa il cui

cioè

where c.Code == sCode 

in SQL il suo fare come questo

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

risposta

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

Questo è per lo standard LINQ, non ho idea se funziona per LINQ a SQL.

Edit: Questo funziona attraverso short circuit evaluation

se c.Code == sCode è falso, si ferma valutazione e restituisce false
altrimenti, se string.IsNullOrEmpty(code) è vero, si ferma valutazione e restituisce true
in caso contrario, tornare p.Code == code

+0

hai la! nel modo sbagliato intorno ..... oh aspetta che l'abbia cambiato. :) – RPM1984

+2

(stealth edit) = D – Greg

+0

Hahah in stile ninja, devi amare come le "modifiche" non vengono visualizzate a meno che non sia dopo circa 5 minuti a rispondere a una domanda. – RPM1984

4

Metti che in un metodo IQueryable<T> proroga per tenerlo molto semplice:

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); 
} 

Usage:

var query = something.WithCodeIfNotEmpty("someCode"); 
3

Come dichiarato da altri:

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

btw sql può essere ottimizzato per

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

Grazie Preet .. Questa è una soluzione molto buona e semplice al problema che sto affrontando. Ho chiesto a un post me stesso e la gente ha appena risposto a DLinq e ha esteso i metodi .. tutto quello che volevo è la tua soluzione .. – lawphotog

0

Se si desidera un modulo di traduzione diretta che TSQL si dato, allora questa è la risposta

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