私たちはビジネスソリューションでORMを選択し、すべてをデカップリングし、ninjectを使って素敵なコンポジションルートを構築したn層ファッションで構成しています。Entity Framework 5クエリで間違ったデータ型
最近では、パーティション分割を使用するデータベースを構築しており、DATE
列にいくつかの重要なインデックスがあります。
列はSql Server 2008で正しく宣言されています。また、HasColumnType("Date")
命令を使用して、EFマッピングに正しいデータ型を追加しました。
エンティティへのLINQを通じてテーブルを照会するときに型がパラメータと一致するように、それでも、我々はタイプDateTime2
と偶数列で作成された上で日付をフィルタリングパラメータはクエリでDateTime2
にキャストされています。
この動作にはいくつかの問題があります。まず、EFエンジンにデータベースの列がDATE
だと伝えたら、なぜそれをDateTime2
にキャストすべきですか?
第2に、このキャストはデータベースにインデックスを無視させるため、パーティション分割を使用しないようにしています。私たちはフィジカルパーティショニングごとに1年間を持っています。もし私が日付範囲を聞いたら、2013年3月に2013年2月にスキャンが1つの物理パーティションでしか起こらないと言いましょう。正しいデータ型DATE
を手動で使用すると正しく動作しますが、キャストをDateTime2
にすると、すべてのパーティションがスキャンされ、パフォーマンスが大幅に低下します。
Microsoft SQL ServerでMicrosoft ORMがうまく動作しないということは、むしろ愚かなので、私は何かを逃していると思います。
EFがどのように正しいデータ型をクエリで使用しているかに関するドキュメントが見つかりませんでしたので、ここで質問しています。どんな助けもありがとう。
ありがとうございました。
私は大量のナビゲーションプロパティで遅延読み込みを使用しています。私は熱心にすべてを読み込み、手作業でオブジェクトグラフを作成する必要があります。これは非常に複雑で深いので、オプションではありません。たぶんNHibernateのような別のORMに移動するのが正しい選択でしょう。 –
@MatteoMosca - 私は問題を誤解していない限り、実際にはそうは思わない。 EFでは、sp *の結果を*添付されたエンティティ(MSDNによれば "コンテキストによって追跡される")として実現することができるので、遅延読み込みが機能するはずです。できないことは、このメソッドを使って* eager * loadingをサポートすることです。 – Olly
これは興味深いかもしれません。私はこの機能が欠けていたと思う。私はできるだけ早くそれを見ていきます。 –