2016-11-02 103 views
3

我一直在測試幾種方法來比較兩個LINQ to Entities中的DateTimeOffset對象,但我不確定哪一個對象最有效率和實際正確的做法它。正確地比較LINQ to Entities中沒有Time的DatetimeOffset

我嘗試以下:

SomeTable.Where(a => DbFunctions.TruncateTime(a.StartUtc) <= intendedDate && DbFunctions.TruncateTime(a.EndUtc) >= intendedDate); 

其產生用於比較這個大複雜查詢:

((convert (datetimeoffset, convert(varchar(255), [Extent1].[StartUtc], 102) + ' 00:00:00 ' + Right(convert(varchar(255), [Extent1].[StartUtc], 121), 6) , 102)) <= @p__linq__1) AND ((convert (datetimeoffset, convert(varchar(255), [Extent1].[EndUtc], 102) + ' 00:00:00 ' + Right(convert(varchar(255), [Extent1].[EndUtc], 121), 6) , 102)) >= @p__linq__2) 

也試過DiffDays,即生成一個更可讀的查詢

((DATEDIFF (day, [Extent1].[StartUtc], '2016-11-01 00:00:00 -02:00')) >= 0) AND ((DATEDIFF (day, '2016-11-01 00:00:00 -02:00', [Extent1].[EndUtc])) >= 0) 

但這個查詢需要時間考慮,我不能這樣做。

我不是專家,但對於這樣一個簡單的要求,第一個查詢似乎真的很漫長和複雜。這種情況下,我應該使用原始SQL而不是LINQ與EF?我無法確定哪種方法最有效。 我覺得CAST('2016-11-02 00:00:00 AM -02:00' AS DATE)比查詢EF生成的要簡單得多,因此性能更高。

這裏最好的做法是什麼?

+0

使用'Date'屬性將截斷時間爲午夜,然後獲取日期之間的差異。 DateTime以雙精度形式存儲在計算機中,整數部分是從1/1/1900開始的天數,小數部分是當前時間/ 24(即3.5小時/ 24小時)。 – jdweng

+0

@jdweng L2E不支持Date屬性 –

回答

0

如何處理包含時間的棘手問題?

var cmpStartDate = intendedDate.AddDays(1); 

var ans = SomeTable.Where(a => a.StartUtc < cmpStartDate && a.EndUtc > intendedDate.Subtract(TimeSpan.FromTicks(1)));