2010-03-17 8 views
7

Sto provando a verificare se una data è nullo in linq e se non lo è è una data futura.Clausola dove clausola con condizioni multiple e controllo nullo

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

Ho bisogno del secondo controllo per applicare solo se il primo è vero. Sto usando un singolo modello di repository e FindAll ha accettato una clausola where

QUALSIASI idea? Ci sono un sacco di domande simili qui ma non che dia la risposta, sono molto nuovo a Linq come puoi immaginare :)

Modifica: ottengo i risultati che richiedo ora ma controllerà il> condizionale su valori nulli in alcuni casi. Non è una brutta cosa?

+0

Non puoi semplicemente dire dove (q.ExpiredDate> DateTime.Now)? Questo dovrebbe restituire tutte le righe in cui l'ExpiredDate è una data futura. – Richard

risposta

8

Non funziona?

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

Sto restituendo voci attive :) – Andrew

+0

@SocialAddict: puoi chiarire i criteri esatti che desideri? La tua domanda dice "controlla se una data non è nulla ... e se non è il controllo è una data passata", che è esattamente ciò che fa il mio codice (e il codice dato in tutte le altre risposte finora). Tuttavia, il codice di esempio nella tua domanda non lo fa! – LukeH

+0

Un buon punto riscritto, mi spiace :) – Andrew

2

Se questo è Linq to SQL o LINQ to Entities allora HasValue non si tradurrà in un'espressione SQL e si otterrà un'eccezione.

Questo dovrebbe farlo.

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

Ci sono un paio di modi si potrebbe fare questo, un bel modo è utilizzando tubi e filtri, ma guardando come si sta attuare quanto sopra, non sembra che si sta utilizzando questo schema in modo non ci andrò, ma vale la pena di googling.

Con tubi e filtri modello che si potrebbe fare questo:

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

E poi basta andare: QuestionnaireRepo.FindAll().WithExpiryDate().WhereExpiredDateBeforeThanNow().SingleOrDefault();

si potrebbe anche semplicemente dire:

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

Spero che questo aiuti ...