如果将日期值转换为double并使用if的小数部分,则会得到0到1之间的数字,表示一天中的某个时间。因此,测试时间间隔是微不足道的,例如, 13:45将是0,5729166667(或更确切地说:13:45.345是0,572920679)。
您可以这样做,因为EF(即4。3,我使用的版本)转换角色,甚至数学函数到SQL:
mycontext.Data.Where(dt => dt.DateTime.HasValue)
.Select(dt => dt.DateTime.Value).Cast<double>()
.Select(d => d - Math.Floor(d))
.Where(... your comparisons
这意味着含CAST([date column] AS float)
和SQL的FLOOR
功能的SQL。
您的意见后:
它看起来那么容易,但我不能找到一种方法来指导EF就在Select()
一个单一的财产做一个CAST
。只有Cast<>()
函数被转换为CAST
(sql),但是它在一个集合上运行。
好了,幸运的是,还有另一种方式:
mycontext.Data.Where(dt => dt.DateTime.HasValue)
.Select(dt => new
{
Date = DbFunctions.TruncateTime(dt.DateTime.Value),
Ms = DbFunctions.DiffMilliseconds(
DbFunctions.TruncateTime(dt.DateTime.Value), dt.DateTime.Value)
})
.Where(x => x.Ms > lower && x.Ms < upper)
其中lower
和upper
是TimeSpan
对象的TotalMilliseconds
财产。
请注意,这在sql中非常低效!每个比较都重复日期函数。因此,请确保您对其他标准尽可能限制的一组数据进行比较。在内存中首先获取数据然后再进行比较可能会更好。
注:在EF6之前,DbFunctions
是EntityFunctions
。
在Linq查询中不能使用DateTime.Parse。 =( – 2012-04-03 14:45:56
)为什么我必须输入一个日期?我不想使用日期,我的疑问是,如果可以在SQL Server 2005中不使用日期(使用EF层)进行这种比较 – 2012-04-03 14:47:18
“ LINQ to Entities不支持指定的类型成员'TimeOfDay'。“ - 你在post之前测试它吗?=/ – 2012-04-03 14:54:03