如何在 LINQ / Lambda 查询中比较可为空的日期时间的日期部分

本文关键字:日期 时间 日期部 比较 LINQ Lambda 查询 | 更新日期: 2023-09-27 18:32:05

我有如下内容:

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是一个可为空的日期时间,每当列表中有空值时,我都会因为"a.AGG_DateEnd.Value.Date"部分而出现异常。

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

我能做些什么来改进?

谢谢

如何在 LINQ / Lambda 查询中比较可为空的日期时间的日期部分

一个快速的技巧是:

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 的情况下出现相反的布尔值结果,即:

!(a.AGG_DateEnd?.Date < SelectedFrom)

观察当我们使用这些根据Nullable<>值进行操作的提升运算符时,x >= y!(x < y)有何不同。任何提升的运算符(如 >=< )如果其中一个xy为空,将立即返回false;仅当 xy 均为非 null 时,才会解开包装,并将内容与将使用返回值的非提升运算符进行比较。