从可以为空的日期时间获取日期?

Dot*_*row 7 c# linq

我已经在我的模型中将一个字段声明为可以为空的日期时间

public DateTime? CallNextDate {get;set;}
Run Code Online (Sandbox Code Playgroud)

在我的aspx代码后面我正在使用这样的linq:

q = q.AsQueryable()
    .Where(c => c.CallNextDate.Date < DateTime.Now.Date )
    .ToList();
Run Code Online (Sandbox Code Playgroud)

c.CallNextDate.Date不可用.请建议如何解决它

Jon*_*eet 16

好吧,如果你已经知道它是非null的,你可以Value用来获取底层的非可空值:

q = q.AsQueryable()
     .Where(c => c.CallNextDate.Value.Date < DateTime.Now.Date)
     .ToList();
Run Code Online (Sandbox Code Playgroud)

或者如果你想过滤它:

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

强烈建议您获取今天的日期一次,虽然,它重新用于整个查询:

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

这会给你更多的一致性.顺便说一句,你应该考虑一下你是否肯定想要系统本地日期.

(顺便问一下,你肯定需要使用AsQueryable吗?这种情况比较少见.)

  • 什么,不喜欢`GetValueOrDefault()`? (2认同)

Kha*_*han 5

可空类型具有Value属性,表示基础类型:

q = q.AsQueryable()
    .Where(c => c.CallNextDate.Value.Date < DateTime.Now.Date )
    .ToList();
Run Code Online (Sandbox Code Playgroud)

但是您需要检查以确保类型具有值.

q = q.AsQueryable()
    .Where(c => c.CallNextDate.HasValue && c.CallNextDate.Value.Date < DateTime.Now.Date )
    .ToList();
Run Code Online (Sandbox Code Playgroud)