2010-03-17 21 views
7

Estoy tratando de verificar si una fecha es nula en linq y si no lo está, verifique que sea una fecha futura.Linq where cláusula con múltiples condiciones y verificación nula

QuestionnaireRepo.FindAll(q => !q.ExpiredDate.HasValue || q.ExpiredDate >DateTime.Now).OrderByDescending(order => order.CreatedDate); 

Necesito la segunda verificación para aplicar solo si la primera es verdadera. Estoy usando un patrón de repositorio único y FindAll aceptó una cláusula where

¿Alguna idea? Hay muchas preguntas similares aquí pero no dan la respuesta, soy muy nuevo en Linq, como es de suponer :)

Editar: Obtendré los resultados que necesito ahora, pero se comprobará el> condicional en valores nulos en algunos casos. ¿No es esto algo malo?

+0

¿No puedes decir dónde (q.ExpiredDate> DateTime.Now)? Eso debería devolver todas las filas donde expira fecha es una fecha futura. – Richard

Respuesta

8

¿Esto no funciona?

QuestionnaireRepo.FindAll(
    q => (q.ExpiredDate == null) || (q.ExpiredDate > DateTime.Now)); 
+0

Devuelvo entradas activas :) – Andrew

+0

@SocialAddict: ¿Puede aclarar los criterios exactos que necesita? Su pregunta dice "compruebe si una fecha no es nula ... y si no es, verifique que sea una fecha pasada", que es exactamente lo que hace mi código (y el código proporcionado en todas las otras respuestas hasta el momento). Sin embargo, el código de ejemplo en su pregunta no hace eso! – LukeH

+0

Buen punto reescrito, lo siento :) – Andrew

2

Si esto es LINQ to SQL o LINQ a Entidades continuación HasValue no se traduce en una expresión SQL y obtendrá una excepción.

Esto debería hacerlo.

QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now) 
1

Hay un par de maneras que usted puede hacer esto, de una manera agradable es el uso de tuberías y filtros, pero viendo cómo se va a implementar lo anterior, no se ve como que está utilizando este patrón por lo no entrará en eso, pero vale la pena buscar en Google.

con tubos y filtros patrón que podría hacer esto:

 public static IQueryable<YourType> WithExpiryDate(this IQueryable<YourType> allMyTypes) 
     { 
      return allMyTypes.Where(f => f.ExpiredDate != null); 
     } 

     public static IQueryable<YourType> WhereExpiredDateBeforeThanNow(this IQueryable<YourType> allMyTypes) 
     { 
      return allMyTypes.Where(f => f.ExpiredDate <= DateTime.Now); 
     } 

Y a continuación, sólo tiene que ir: QuestionnaireRepo.FindAll().WithExpiryDate().WhereExpiredDateBeforeThanNow().SingleOrDefault();

Usted también podría simplemente decir:

QuestionnaireRepo.FindAll(q => q.ExpiredDate != null && q.ExpiredDate <= DateTime.Now); 

Espero que esto ayude ...

Cuestiones relacionadas