2009-09-30 35 views
7

que estoy usando C# .NETLINQ cláusula WHERE usando sentencias if

yo tenemos dos cuadros de texto, que si! Vacío necesidad de formar parte de una cláusula WHERE en una consulta LINQ.

Aquí está mi código

var result = from a in xxxx select a; 

if(!string.IsNullOrEmpty(personName)) 
{ 
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName)  
} 
else if(!string.IsNullOrEmpty(dateFrom)) 
{ 
    return result.Where(a >= a.appStartDateTime >= dateFrom.Date) 
} 
else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom)) 
{ 
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date); 
} 

pensé que esto iba a funcionar, pero no le gusta la .Where y no puedo acceder a la 'a', por ejemplo a.forename (El nombre 'a' no lo hace existen en el contexto actual)

¿Qué estoy haciendo mal, o esto no se puede hacer?

Gracias de antemano por cualquier ayuda.

Clare

+1

Nunca golpearás al último si. Si el último otro si va a ser verdadero, entonces el primero si es verdadero. Por lo tanto, no puedes llegar al último. –

+0

Ahora los he convertido en todas las declaraciones if. – ClareBear

+0

@ClareBear si todavía tienen declaraciones de devolución en ellos, entonces no será de ayuda. Nunca golpeará la última instrucción if que verifique ambas condiciones. Todavía volverás del primero solo. También los reordenaría para que el cheque para personName && dateFrom no sea nulo o vacío se produzca primero. –

Respuesta

6

lugar de esto:

result.Where(a.forename.Contains(personName)) 

Prueba esto:

result.Where(a => a.forename.Contains(personName)) 

Usted Parece que faltan el operador lambda (=>).

+0

Creo que he leído porque está ubicado dentro de una declaración if que no puede acceder a nada fuera de sí mismo, ¿no estoy seguro de si eso es cierto?Como sigo recibiendo el mensaje "El nombre 'a' no existe en el contexto actual" – ClareBear

+0

¿Puedes publicar tu código actualizado? – RichardOD

+0

He actualizado mi pregunta con el código actualizado. – ClareBear

1

..o con el punto sólo una salida:

var result = from a in xxxx select a; 

Func<string, bool> func = null; 

if(!string.IsNullOrEmpty(personName)) 
{ 
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName)};  
} 

else if(!string.IsNullOrEmpty(dateFrom)) 
{ 
func = (a) => {a.appStartDateTime >= dateFrom.Date}; 
} 

else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom)) 
{ 
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date;}; 
} 

return result.Where(func); 
2

probar esto


var result = from a in xxxx select a 
    where (string.IsNullOrEmpty(personName) || a.forename.Contains(personName) 
      || a.surname.Contains(personName)) 
      && (string.IsNullOrEmpty(dateFrom) 
      || a.appStartDateTime >= DateTime.Parse(dateFrom).Date); 

dateFrom que parece ser una cadena así que hay que analizar para obtener una fecha y hora.

Esta lógica debería funcionar pero no la he probado. Podría estar equivocado.

Parece que solo le importa si el nombre o el apellido contienen personName si personName no es nulo o está vacío. Por lo tanto, puede volver a escribir para devolver cosas si el nombre de persona es nulo o está vacío o el nombre anterior o el apellido contiene el nombre de la persona. Desde el || el operador está en cortocircuito, no comprobará Contiene si personName es nulo o está vacío.

2

También se pueden combinar los predicados y hacer que la lógica más corto y más fácil de leer:

var result = from a in xxxx select a; 

if (!string.IsNullOrEmpty(personName)) 
    result = result.Where(a => a.forename.Contains(personName) || a.surname.Contains(personName) 

if (!string.IsNullOrEmpty(dateFrom)) 
    result = result.Where(a >= a.appStartDateTime >= dateFrom.Date) 

return result; 

Este método de combinar los predicados funciona bien con 'y' condiciones. Si necesita 'O' condiciones, es un poco más complicado. Afortunadamente, Joe Albahari ha creado PredicateBuilder (como parte de LINQKit) que ayuda con esto en gran medida.

Espero que esto ayude.

Cuestiones relacionadas