如果將日期值轉換爲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