如何比较linq/lambda查询中可空日期时间的日期部分?

use*_*243 6 c# linq datetime

我有以下内容:

new ObservableCollection<SomeData>(SomeDataCollection.Where(a => a.AGD_Category.Equals((int)AGD_CategoryEnum.Med) && ((a.AGG_DateStart.Date <= SelectedUntill) && (a.AGG_DateEnd.Value.Date >= SelectedFrom))));
Run Code Online (Sandbox Code Playgroud)

现在我的a.AGG_DateEnd是一个可以为空的日期时间,只要列表中有空值,我就会因为"a.AGG_DateEnd.Value.Date"部分而得到异常.

但问题是,a.AGG_DateEnd还包含小时和分钟,但我不希望这导致我的比较给出不可靠的结果.

我该怎么做才能改善?

谢谢,

Jep*_*sen 15

一个快速的黑客是:

a.AGG_DateEnd.GetValueOrDefault().Date >= SelectedFrom
Run Code Online (Sandbox Code Playgroud)

这是可以的,因为default(DateTime)(等于它自己的.Date)不大于任何(其他)DateTime值.

否则通常要做的是:

a.AGG_DateEnd.HasValue && a.AGG_DateEnd.Value.Date >= SelectedFrom
Run Code Online (Sandbox Code Playgroud)

双重&确保快捷评估.


评论后补充:

如果你想要相反的答案null,那就是:

(a.AGG_DateEnd ?? DateTime.MaxValue).Date >= SelectedFrom
Run Code Online (Sandbox Code Playgroud)

分别:

!a.AGG_DateEnd.HasValue || a.AGG_DateEnd.Value.Date >= SelectedFrom
Run Code Online (Sandbox Code Playgroud)

稍后编辑:自C#6.0(2015年7月)以来,您可以使用?.运算符.所以使用更短的代码:

a.AGG_DateEnd?.Date >= SelectedFrom
Run Code Online (Sandbox Code Playgroud)

这将(正式地,至少)比较两个可以为类型的可空值DateTime?.当任一操作数为"null"(即.HasValue给出false)时,这样的比较给出false.

如果你想在null的情况下得到相反的bool结果,那就是:

!(a.AGG_DateEnd?.Date < SelectedFrom)
Run Code Online (Sandbox Code Playgroud)

观察如何x >= y不同于!(x < y)当我们使用这些解除上运行运营商Nullable<>值.任何提升运算符(如>=<)将返回false如果立即之一x,并y为空; 仅当xy非空,他们将展开,并与非提升运算符,其返回值将被用来进行比较的内容.