レコードを取得するためにEntity Frameworkを使用していますが、フィルタの1つはdatetime
です。DateTimeの比較時にEntity Frameworkでdatetime2の代わりにdatetimeが使用されるようにするにはどうすればよいですか?
それは、このようなクエリを生成:
([Extent1].[TxnDateTime] >= convert(datetime2, '2015-02-21 00:00:00.0000000', 121))
AND ([Extent1].[TxnDateTime] <= convert(datetime2, '2017-02-21 23:59:59.9999999', 121))
私はEFがdatetime
代わりのdatetime2
に変換することができます方法はありますか?はるかに速いようです。
[Extent1].[TxnDateTime] >= convert(datetime, '21/02/2015')
AND [Extent1].[TxnDateTime] <= convert(datetime, '21/02/2017')
datetime
で:
CPU時間= 1234ミリ秒、経過時間= 1250ミリ秒。
でdatetime2
:
CPU時間= 1625秒、経過時間= 1645秒。
.NET DateTime
タイプがSQL Server datetime2
にマップされていることを理解しています。私のオプションは何ですか?
列はNULL可能datetime
であり、私は興味深いDateTime?
エンティティとスキーマの設定方法、実行中のクエリ、使用しているデータベース/バージョンを拡張できますか? DateTime .NetプロパティタイプのSQL ServerとDateTimeの列型に直面すると、次のようになります。convert(datetime2 '2016-07-01 00:00:00.0000000'、121)= [Extent1] 。[TxnDateTime]データベース列で余分な変換が発生していません。あなたが文字列に変換してからDateTime2に戻るという事実は、あなたの列とプロパティマッピングの間に何か不思議なことがあることを暗示しているようです。 –
あなたが正しいです、私が使用した関数、 'TruncateTime'によって変換が行われました。私はそれを削除することができた、私の質問を更新します。 –
エンティティ間でEFクエリを実行し、DateTime値の範囲で検索すると、DateTime2とDateTimeの変換のパフォーマンスはほとんど無視できます。私は、クエリとCPUコストの両方のセットでプロファイラを実行しました。有効期間は事実上同一でした。 (ときどきdatetime2のほうが多少高価でしたが、時々datetimeの実行にはコストがかかりました(1回の実行につき100k行以上の50ms以内)。私はあなたが観察したかもしれないパフォーマンスがtruncate関数によるものだと考えています –