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

本文关键字:定时间 之间 记录 一天 提取 实体 框架 | 更新日期: 2023-09-27 18:11:35

我有一个订单表,它有一个名为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之前的那些。所以你必须这样做:>

&& 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列,这样你就可以在单个数据变量中比较所有这些?

第一个答案是使用

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 to entity不支持TimeOfDay!

nop

ok。我的解决方案是计算TimeOfDay在指定的单位,例如分钟或秒或毫秒…对于你的问题,我想一分钟就可以了。

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
         )
   );

希望有所帮助

您可以使用TimeOfDay:

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