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

时间:2014-11-26 08:22:43

标签: 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))));

现在我的a.AGG_DateEnd是一个可以为空的日期时间,只要列表中有空值,我就会得到一个例外,因为&#34; a.AGG_DateEnd.Value.Date&#34;一部分。

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

我可以做些什么来改进?

谢谢,

1 个答案:

答案 0 :(得分:13)

快速破解是:

a.AGG_DateEnd.GetValueOrDefault().Date >= SelectedFrom

这没关系,因为default(DateTime)(等于其自己的.Date)不大于任何(其他)DateTime值。

否则通常要做的事情是:

a.AGG_DateEnd.HasValue && a.AGG_DateEnd.Value.Date >= SelectedFrom

其中双&确保快捷评估。


评论后补充:

如果您希望在null的情况下得到相反的答案,那就是:

(a.AGG_DateEnd ?? DateTime.MaxValue).Date >= SelectedFrom

分别为:

!a.AGG_DateEnd.HasValue || a.AGG_DateEnd.Value.Date >= SelectedFrom

稍后修改:自C#6。0(2015年7月)以来,您可以使用?.运算符。所以使用更短的代码:

a.AGG_DateEnd?.Date >= SelectedFrom

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

如果你想要null的相反bool结果,那就是:

!(a.AGG_DateEnd?.Date < SelectedFrom)

当我们使用运行x >= y值的提升运算符时,请观察!(x < y)Nullable<>的不同之处。如果>=<中的一个为空,则任何提升的运算符(如falsex)都会立即返回y;仅当xy都为非空时,它们才会被解包,并且内容会与将使用其返回值的非提升运算符进行比较。