Event
私のクラスを考えてみましょう。私はDateTime
を UTC 日付として DB に保存します。特定のタイムゾーンの現在の日付に基づいてフィルタリングされた範囲を返したいだけです-簡単ですよね?
これはうまくいきます:
IQueryable<Event> test1 = this.GetSortedEvents().Where(e => e.FinishDateTime.Date >= DateTime.UtcNow.Date);
これもうまくいきます:
IQueryable<Event> test2 = this.GetSortedEvents().Where(e => e.FinishDateTime.AddHours(3).Date >= DateTime.UtcNow.AddHours(3).Date);
..さらに、タイムゾーンの要件も満たしています。
だからここで私はこの特定の変換をこの拡張メソッドに移すことができると考えています:
public static DateTime RiyadhTimeFromUtc(this DateTime utcTime) { return utcTime.AddHours(3); }
これは動作しません:
IQueryable<Event> test3 = this.GetSortedEvents().Where(e => e.FinishDateTime.RiyadhTimeFromUtc().Date >= DateTime.UtcNow.RiyadhTimeFromUtc().Date);
.. そして、私はこの NotSupportedException を取得します: Method 'System.DateTime RiyadhTimeFromUtc(System.DateTime)' has no supported translation to SQL.
同一のコードが拡張メソッドにない場合、コンパイラは喜んでSQLに変換したため、これは明らかにゴミです。
以前、特定のタイプと最近の DateTime で「SQL への変換がサポートされていません」という問題に遭遇しました。しかし、上記の私のテストとこのリンクは、AddHours メソッドが SQL 変換でサポートされるべきであることを証明しています。
ここで私が間違っていること(またはこの問題に対する別の回避策)を誰かが教えてくれたら、本当に感謝しています。