2012-11-21 13 views
7

I zadeklarowały pole w moim modelu jako wartości pustych datetime jak tenuzyskiwanie daty z zerowej wartości datetime?

public DateTime? CallNextDate {get;set;} 

w moim kodzie aspx za Używam tego LINQ tak:

q = q.AsQueryable() 
    .Where(c => c.CallNextDate.Date < DateTime.Now.Date) 
    .ToList(); 

ale c.CallNextDate.Date nie jest dostępna. Proszę zaproponować, jak rozwiązać to

Odpowiedz

16

Cóż, jeśli już wiesz, że to niezerowe, można użyć Value uzyskać podstawową wartość spoza zerowalne:

q = q.AsQueryable() 
    .Where(c => c.CallNextDate.Value.Date < DateTime.Now.Date) 
    .ToList(); 

Albo jeśli chcesz filtrować że zbyt :

q = q.AsQueryable() 
    .Where(c => c.CallNextDate.Value != null && 
       c.CallNextDate.Value.Date < DateTime.Now.Date) 
    .ToList(); 

ja bym silnie zachęcamy do pobrania dzisiejszą datę raz choć i używać go dla całego zapytania:

var today = DateTime.Today; 
q = q.AsQueryable() 
    .Where(c => c.CallNextDate.Value != null && 
       c.CallNextDate.Value.Date < today) 
    .ToList(); 

Zapewni to większą spójność. Powinieneś naprawdę zastanowić się, czy na pewno chcesz mieć lokalną datę lokalną datę, przy okazji.

(Czy na pewno trzeba używać AsQueryable, przy okazji To stosunkowo rzadko?).

+1

Co, bez miłości dla 'GetValueOrDefault()'? –

+0

@JonB: To by działało * jeśli * OP chce uwzględnić wszystkie wpisy bez daty. Niestety wymagania są bardzo niejasne. –

5

dopuszczające wartość null typy mają właściwość wartość, która reprezentuje typ podstawowy:

q = q.AsQueryable() 
    .Where(c => c.CallNextDate.Value.Date < DateTime.Now.Date) 
    .ToList(); 

Ale trzeba będzie sprawdź, czy typ ma wartość.

q = q.AsQueryable() 
    .Where(c => c.CallNextDate.HasValue && c.CallNextDate.Value.Date < DateTime.Now.Date) 
    .ToList(); 
Powiązane problemy