繁体   English   中英

如何在实体框架中提取当天指定时间之间的记录?

[英]How to extract records which are between specified hours of the day in Entity Framework?

我有一个Orders表,它有一个名为OrderDateTime的字段。

我想在我的查询中应用两个过滤器:

  1. 从给定的fromDate到给定的toDate提取已发生的订单
  2. 仅显示从给定的fromTime到给定的toTime发生的订单

例如,查询可能是:

显示上周的订单,这些订单仅在早上10点到中午2点之后发生

我现在所做的就是这个查询:

return Orders
       .Where(o => o.OrderDateTime > fromDate
                && o.OrderDateTime < toDate
                && o.OrderDateTime.Hour > fromTime.Hours
                && o.OrderDateTime.Minute > fromTime.Minutes
                && o.OrderDateTime.Hour > toTime.Hours
                && o.OrderDateTime.Minute > toTime.Minutes
             );

但我没有得到任何记录,而我在那个时候有订单。 我的查询有什么问题?

注意: fromTimetoTimeTimeSpan对象。

第一个问题是您使用>而不是< 乍一看它应该是:

    ...
    && o.OrderDateTime.Hour < toTime.Hours
    && o.OrderDateTime.Minute < toTime.Minutes
);

但是这会将所有数据排除在< toTime.Minutes ,也就是在toTime.Hours之前的toTime.Hours 所以你必须这样做:

&& o.OrderDateTime.Hour * 100 + o.OrderDateTime.Minute 
       > fromTime.Hours * 100 + fromTime.Minutes
&& o.OrderDateTime.Hour * 100 + o.OrderDateTime.Minute
         < toTime.Hours * 100 + toTime.Minutes

对于EF,您必须创建fromTime.Hours * 100 + fromTime.MinutestoTime.Hours * 100 + toTime.Minutes ,并将它们放在linq语句中。

也许您应该使用>=<=进行小时和分钟比较。

我想你想要这个:

    return Orders
   .Where(o => o.OrderDateTime > fromDate
            && o.OrderDateTime < toDate
            && o.OrderDateTime.Hour > fromTime.Hours
            && o.OrderDateTime.Minute > fromTime.Minutes
            && o.OrderDateTime.Hour < toTime.Hours
            && o.OrderDateTime.Minute < toTime.Minutes
         );

在你的例子中,最后两个<符号>

@EDIT:另外,为什么不使用DateTime列,以便比较单个数据变量中的所有内容?

你可以使用TimeOfDay

return Orders
.Where(o => o.OrderDateTime > fromDate
        && o.OrderDateTime < toDate
        && o.OrderDateTime.TimeOfDay > fromTime
        && o.OrderDateTime.TimeOfDay < toTime 
     );

第一个答案是使用

return Orders
  .Where(o => o.OrderDateTime > fromDate
      && o.OrderDateTime < toDate
      && o.OrderDateTime.TimeOfDay.TotalMinutes > fromTime.TimeOfDay.TotalMinutes
      && o.OrderDateTime.TimeOfDay.TotalMinutes < toDate.TimeOfDay.TotalMinutes
   );

!!!!! 但是等等,它不能用于实施LINQ !!!!!

因为Linq to entity不支持TimeOfDay!

好的nop。 我的意思是以指定的单位计算TimeOfDay,例如Minutes或Seconds或Milisecends ......对于你的问题,我认为分钟是好的。

return Orders
  .Where(o => 
      o.OrderDateTime > fromDate && o.OrderDateTime < toDate
      && (
          o.OrderDateTime.Hours * 60 + o.OrderDateTime.Minutes
           > 
          fromTime.Hours * 60 + fromTime.Minutes
         )
      && (
         o.OrderDateTime.Hours * 60 + o.OrderDateTime.Minutes
          <
          toTime.Hours * 60 + toTime.Minutes
         )
   );

希望能帮助到你

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM