私のEvent
クラスを考えてみましょう。そして、私はDateTime
をUTCの日付としてDBに保存しています。私は単に、特定のタイムゾーンで現在の日付に基づいてフィルタリングされた範囲を返すことを望んでいます。また、これは正常に動作しますLINQ to SQLが拡張メソッドで騙されたのはなぜですか?今何?
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:メソッド 'System.DateTime RiyadhTimeFromUtc(System.DateTime)'にはSQLへの変換がサポートされていません。
これは明らかに、同じコードが拡張メソッドではなかった場合、コンパイラがSQLに変換してくれたので、これは明らかにごみです。
特定のタイプと最近のDateTimeでは、以前は「SQLへの変換はサポートされていません」という問題が発生しました。しかし、上記のテストとthis linkは、AddHoursメソッドがSQL変換でサポートされるべきであることを証明しています。
誰かが私がここで間違っていること(またはこの問題に対する別の回避策)を教えてもらえれば、本当に感謝しています。
これは素晴らしい説明です。しかし、私はまだそれが私にどのように役立つのかわかりません。私の問題に対する具体的な提案はありますか? –
私はそれを行うためにLinq Expressionsを使用しようとしています - http://www.albahari.com/nutshell/predicatebuilder.aspxご協力ありがとう –