如何在 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还包含小时和分钟,但我不希望这导致我的比较给出不可靠的结果。
我能做些什么来改进?
谢谢
一个快速的技巧是:
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)
有何不同。任何提升的运算符(如 >=
或 <
)如果其中一个x
和y
为空,将立即返回false
;仅当 x
和 y
均为非 null 时,才会解开包装,并将内容与将使用返回值的非提升运算符进行比较。