2010-11-17 12 views
6

¿Es posible incluir una cláusula en el lugar (LINQ) pero solo si su "NO" está vacío?¿Usar la variable en la cláusula where solo si NO está vacía? Una especie de cláusula dinámica donde?

es decir

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

En este caso la variable (estándar C#) se denomina código ... si no está vacío, lo anteriormente expuesto, donde es grande .. pero si su vacío, entonces yo no quiero incluyen en ella el donde

es decir

where c.Code == sCode 

en SQL su hecho como este

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

Respuesta

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

Eso es para el estándar de LINQ, no tengo ni idea de si funciona para LINQ a SQL.

Editar: Esto funciona a través short circuit evaluation

si c.Code == sCode es falsa, se detiene la evaluación y devuelve falso
de otro modo, si string.IsNullOrEmpty(code) es cierto, se detiene la evaluación y devuelve verdadero
lo contrario, volver p.Code == code

+0

que tenga el! de la manera incorrecta aroun ... oh espera, lo cambiaste. :) – RPM1984

+2

(edición sigilosa) = D – Greg

+0

Hahah estilo ninja, me encanta cómo "ediciones" no aparecen a menos que sea después de 5 minutos más o menos de responder a una pregunta. – RPM1984

4

poner esto en un método IQueryable<T> extensión de mantenerlo muy simple:

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

Uso:

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

Según lo declarado por otros:

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

por cierto SQL puede ser optimizado para

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

Gracias Preet .. Esta es una solución muy buena y simple para el problema que estoy enfrentando. Solicité una publicación yo mismo y la gente acaba de responder DLinq y ext métodos .. todo lo que quería es su solución .. – lawphotog

0

Si desea un formulario traducción directa que Tsql se dan a continuación, esta es la respuesta

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