比较日期我的日期为空

时间:2015-12-21 18:35:34

标签: c# linq

我正在尝试在StartDateEndDate之间的Linq查询中获取所有日期。我的StartDateEndDate都是正确的日期,但我的结果不一致。查询中的其他所有内容都有效,而不是日期的比较。我做错了什么?

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日搜索时看到此范围内的日期显示

2 个答案:

答案 0 :(得分:5)

如果您尝试获取FirstAirDate介于startDateendDate之间的所有实例(并且startDateendDate可以为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)

我可以问,是startDateendDateobjectDateTime?(即Nullable<DateTime>的声明的C#类型(编译时类型) )。如果它们是Nullable<>,如果你敢,你可以使用否定和解除操作符并将其转换为:

where !(o.FirstAirDate <= startDate) && !(endDate <= o.FirstAirDate)

请注意,null检查包含在此处。如果<=的操作数为null,则结果为false,并且由于否定,它将在null个案例中起作用。