2012-11-21 29 views
7

Tôi đã tuyên bố một lĩnh vực trong mô hình của tôi như datetime nullable như thế nàynhận ngày từ datetime không thể thực hiện được?

public DateTime? CallNextDate {get;set;} 

trong mã aspx của tôi đằng sau Tôi đang sử dụng LINQ này như thế này:

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

nhưng c.CallNextDate.Date không có sẵn. Xin gợi ý làm thế nào để sửa chữa nó

Trả lời

16

Vâng, nếu bạn đã biết nó không phải là null, bạn có thể sử dụng Value để có được những tiềm ẩn giá trị không nullable:

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

Hoặc nếu bạn muốn lọc vào đó quá :

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

tôi muốn mạnh khuyến khích bạn lấy ngày hôm nay lần mặc dù, và tái sử dụng nó cho toàn bộ truy vấn:

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

Điều đó sẽ mang lại cho bạn sự nhất quán hơn. Bạn thực sự nên cân nhắc xem bạn có chắc chắn muốn có ngày địa phương hệ thống địa phương hay không.

(Bạn có chắc chắn cần phải sử dụng AsQueryable, bằng cách này Đó là tương đối hiếm?.)

+1

Điều gì, không yêu thích 'GetValueOrDefault() '? –

+0

@JonB: Điều đó sẽ hoạt động * nếu * OP muốn bao gồm tất cả các mục nhập không có ngày. Thật không may các yêu cầu rất không rõ ràng. –

5

loại Nullable có một tài sản giá trị đại diện cho các loại hình cơ bản:

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

Nhưng bạn sẽ cần phải kiểm tra để đảm bảo loại có giá trị.

q = q.AsQueryable() 
    .Where(c => c.CallNextDate.HasValue && c.CallNextDate.Value.Date < DateTime.Now.Date) 
    .ToList(); 
Các vấn đề liên quan