[英]How to extract records which are between specified hours of the day in Entity Framework?
我有一个Orders表,它有一个名为OrderDateTime的字段。
我想在我的查询中应用两个过滤器:
fromDate
到给定的toDate
提取已发生的订单 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
);
但我没有得到任何记录,而我在那个时候有订单。 我的查询有什么问题?
注意: fromTime
和toTime
是TimeSpan
对象。
第一个问题是您使用>
而不是<
。 乍一看它应该是:
...
&& 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.Minutes
和toTime.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.