从没有时间过滤的日期c#mvc

Bar*_*xto 2 c# datetime

我在mvc应用程序中有2个输入:date_from和date_to(这是仅在视图上的日期,而不是DateTime)

当我调用一个服务来获取我调用的那些值的结果

Result result = client.GetResults(from = date_from, to = date_to);
Run Code Online (Sandbox Code Playgroud)

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

context.Results.Where(r=> r.date >= date_from && r.date <= date_to);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

谢谢.

Jon*_*eet 10

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

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

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

编辑:好的,评论听起来好像我们到了某个地方 - 问题是DateTime当你处理"只是日期"和"日期和时间"时.NET会使用.通常在表示带日期的间隔时,您使用包含间隔("我在星期一到星期五休假"),而日期和时间则使用独占上限("我的第一次会议是3:00-4:00,我的第二个是4:00-5:00." - 4点,你的第一次会议已经结束,第二次会议已经开始了."

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

// 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);
    ...
}
Run Code Online (Sandbox Code Playgroud)