2

我在 mvc 应用程序中有 2 个输入:date_from 和 date_to(这是仅显示日期,而不是日期时间)

当我调用服务以获取由我调用的那些值过滤的结果时

Result result = client.GetResults(from = date_from, to = date_to);

GetResults 中的逻辑在 EF5 上执行 linq,如下所示:

context.Results.Where(r=> r.date >= date_from && r.date <= date_to);

因为视图只有日期时间的日期部分,如果我从:2013-12-01 到:2013-12-01

我得到的唯一结果是 0:0:0 小时的结果

我想要做的是以 to 作为日期结束来调用服务。

  • 注意:我不想更改服务逻辑,因为时间在其他地方使用。
  • 注意 2:我不想发送 date_to.AddDays(1) 因为它会在 0:0:0 小时向我显示另一个日期的数据。

什么是好的解决方案?我想出了 date_to.AddDays(1).AddMilliseconds(-1) 但不认为这是一个好方法。

谢谢。

4

1 回答 1

10

最简单的方法是添加一天,但将上限更改为独占:

var lowerBoundInclusive = date_from;
var upperBoundExclusive = date_to.AddDays(1);
context.Results.Where(r=> r.date >= lowerBoundInclusive && 
                          r.date < upperBoundExclusive);

像这样的半开区间很好,因为它们自然地邻接——您可以使用一个区间的独占上限作为下一个区间的包含下限,等等——并且每个值都将落入一个区间。这也意味着每个边界都是漂亮的圆形值,易于阅读。

编辑:好的,有了评论,听起来我们已经到了某个地方 - 问题是 .NETDateTime在处理“仅日期”和“日期和时间”时使用。通常,当用日期表示区间时,您使用包含区间(“我周一到周五放假”),而对于日期和时间,您使用独占上限(“我的第一次会议是 3:00-4:00,我的第二次会议是 4:00-5:00。” - 在 4:00,您的第一次会议已经结束,第二次会议已经开始。)

我建议编写两种方法,其中一种可以调用另一种:

// This is *inclusive* of both bounds
public XYZ GetResultsByDate(DateTime fromDate, DateTime toDate)
{
    return GetResultsByDateAndTime(fromDate.Date, toDate.Date.AddDays(1));
}

// This is *exclusive* of the upper bound
public XYZ GetResultsByDateAndTime(DateTime from, DateTime to)
{
    var results = context.Results.Where(r=> r.date >= from && r.date < to);
    ...
}
于 2013-07-30T19:13:59.863 回答