1

我有一个订单表,它有一个名为 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
             );

但是我没有任何记录,而我当时确实有订单。我的查询有什么问题?

注意:fromTimetoTime都是TimeSpan对象。

4

4 回答 4

2

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

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

但这不包括所有带有 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.MinutesandtoTime.Hours * 100 + toTime.Minutes放入 linq 语句中。

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

于 2013-05-01T13:55:32.443 回答
1

我想你想要这个:

    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 列,以便您可以比较单个数据变量中的所有内容?

于 2013-05-01T13:12:49.683 回答
0

你可以使用TimeOfDay

return Orders
.Where(o => o.OrderDateTime > fromDate
        && o.OrderDateTime < toDate
        && o.OrderDateTime.TimeOfDay > fromTime
        && o.OrderDateTime.TimeOfDay < toTime 
     );
于 2013-05-01T13:23:39.573 回答
0

第一个答案是使用

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 !!!!!

因为 Linq to entity 不支持 TimeOfDay!

好的,不。我的解决方案是以指定的单位计算 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
         )
   );

希望能帮助到你

于 2013-05-01T14:09:48.203 回答