2011-01-14 13 views
8

Nella seguente istruzione LINQ, desidero selezionare le persone con una data di esame nel 2010. La data dell'esame viene memorizzata come un datetime come la data e l'ora effettive viene utilizzata in altre applicazioni. Qual è il modo più elegante, semplice e migliore per confrontare la data exzam con il solo '2010'. Oppure, dovrei semplicemente confrontare, usando> =, la data dell'esame al 1/1/2010?Utilizzare solo la parte dell'anno di una data per una condizione WHERE

var active = dc.People.Where(x => x.exam >= 2010) 
     .Select(x => new {x.ContactID, x.FirstName, x.LastName}) 
        ); 

x.MostRecent == DateTime.Parse("1/1/2010").Year 

EDIT # 1

ho pensato di vedere un .year alla data di esame, ma non l'ho fatto. Dopo aver visto un paio di post qui sono tornato e ho trovato questo funziona ...

.Where(x => x.exam.Value.Year == 2010) 

Perché .Value necessaria per accedere .year? L'esame è un datetime nullable.

+0

'.Valore' è necessario perché' exam' è un campo nullable nel modello. (Presumo nel tuo database la colonna corrispondente consente NULL.) –

+0

@Scott - Questo è corretto, il DB consente i null in quella colonna. Grazie. – DenaliHardtail

risposta

18

Si può semplicemente utilizzare la proprietà Year su DateTime:

var active = from p in dc.People 
      where p.Exam.Year >= 2010 
      select new { 
       p.ContactID, 
       p.FirstName, 
       p.LastName 
      }; 

Perché .Value necessaria per accedere .year? L'esame è un datetime nullable.

Proprio perché Exam è un Nullable<DateTime>. Quando si dichiara un'istanza di Nullable<DateTime> come

DateTime? exam; 

nota che exam non è un DateTime e quindi non è possibile accedere direttamente alle proprietà di DateTime. Per avere un esempio concreto di DateTime si utilizza la proprietà Value su Nullable<DateTime> (tutti Nullable<T> s hanno questa proprietà) in modo che

DateTime instance = exam.Value; 

è un DateTime partendo dal presupposto che non è examnull. Si può quindi dire che

int year = instance.Year; 

e, naturalmente, per brevità

int year = exam.Value.Year; 

Si noti che questo getterà se exam.HasValue è falso.

+0

Vedere la mia modifica sopra. Perché ho bisogno di usare .Value.Year? – DenaliHardtail

+0

@ SpecialAgent_W436: Esattamente perché 'People.Exam' è un' Nullable '(noto anche come' DateTime? '). – jason

+0

Grazie per la spiegazione! Perfettamente chiaro ora. – DenaliHardtail

0

non so il modo più elegante, ma questo è il modo più semplice si può fare assumendo examdate è il colle datetime che si memorizza la data e sulla base I want to select people with an exam date in 2010 -

var active = dc.People.Where(x => x.examdate.year == 2010) 
     .Select(x => new {x.ContactID, x.FirstName, x.LastName}) 
        ); 
Problemi correlati