2016-11-02 16 views
3

LINQの2つのDateTimeOffsetオブジェクトを比較するためのいくつかのアプローチを試してきましたが、どちらが最も効率的で実際の正しい方法であるかわかりませんそれ。 LINQで時間を持たない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) 

このクエリには時間を要しますが、私はそれを持つことはできません。

私はエキスパートではありませんが、最初のクエリは、このような単純な要件のために実際には長くて複雑なようです。これは、EFでLINQの代わりに未処理のSQLを使用する必要がある場合ですか?私はどちらが最も効率的なアプローチであるかを判断することはできません。 CAST('2016-11-02 00:00:00 AM -02:00' AS DATE)は、EFが生成するクエリよりもはるかに簡単でパフォーマンスが良いと感じています。

ここで最も効果的な方法は何ですか?

+0

時間を[Midnight]に切り捨て、日付の差を取得する 'Date'プロパティを使用します。 DateTimeはコンピュータに二重として格納され、整数部分は1/1/1900からの日数であり、現在時刻/ 24(すなわち3.5時間/ 24時間)である。 – jdweng

+0

@jdweng 'Date'プロパティはL2Eではサポートされていません –

答えて

0

含まれている時間では厄介なのはどうでしょうか?

var cmpStartDate = intendedDate.AddDays(1); 

var ans = SomeTable.Where(a => a.StartUtc < cmpStartDate && a.EndUtc > intendedDate.Subtract(TimeSpan.FromTicks(1))); 
関連する問題