我正在尝试在StartDate
和EndDate
之间的Linq查询中获取所有日期。我的StartDate
和EndDate
都是正确的日期,但我的结果不一致。查询中的其他所有内容都有效,而不是日期的比较。我做错了什么?
where (startDate == null || DateTime.Compare((DateTime)startDate,
o.FirstAirDate) < 0) && (endDate == null|| DateTime.Compare(
o.FirstAirDate, (DateTime)endDate) > 0)
日期显示在范围之外,当我将日期移近时,没有任何显示。例如,如果我从12月21日到26日搜索,我会得到这两个日期之间的结果,但也会显示第27个节目的日期。如果我从12月23日到26日搜索没有显示,即使我在12月21日至26日搜索时看到此范围内的日期显示
答案 0 :(得分:5)
如果您尝试获取FirstAirDate
介于startDate
和endDate
之间的所有实例(并且startDate
或endDate
可以为null)它们都是您可能想要尝试的DateTime
个对象:
var objects = MyObjectsList.Where(o =>
(!startDate.HasValue || o.FirstAirDate >= startDate.Value)
&& (!endDate.HasValue || o.FirstAirDate <= endDate.Value))
您可以使用简单的比较运算符比较日期,在进行比较时只需使用.Value
作为可以为空的DateTime属性 - 在这种情况下,最好先进行空检查。
答案 1 :(得分:2)
你最后的不平等:
DateTime.Compare(o.FirstAirDate, (DateTime)endDate) > 0
是错误的方式。与看起来正确的第一个不等式相比,您可以 将两个参数交换为Compare
, 或 < / strong>将< 0
更改为> 0
。但是你们两个都相互抵消了。
直接使用DateTime
值之间的比较更容易,例如:
where (startDate == null || (DateTime)startDate < o.FirstAirDate)
&& (endDate == null || o.FirstAirDate < (DateTime)endDate)
我可以问,是startDate
和endDate
,object
或DateTime?
(即Nullable<DateTime>
的声明的C#类型(编译时类型) )。如果它们是Nullable<>
,如果你敢,你可以使用否定和解除操作符并将其转换为:
where !(o.FirstAirDate <= startDate) && !(endDate <= o.FirstAirDate)
请注意,null
检查包含在此处。如果<=
的操作数为null
,则结果为false
,并且由于否定,它将在null
个案例中起作用。