多くの人と同じように、コードをできるだけシンプルで読みやすく保ちながら、アプリから最高のパフォーマンスを引き出すことを目指しています。私はLinq-to-SQLを使用しており、データレイヤーを可能な限り宣言的に保つようにしています。
私は、SQL 呼び出しが最もコストのかかる操作であるという前提に基づいて操作しています。したがって、私はそれらの量を最小限に抑えようとしていますが、最適化が難しい非常に複雑なクエリは避けようとしています.
適切な例: 私はDataContext でDataLoadOptionsを使用しています。その目標は、関連するエンティティをプリロードすることにより、クエリの量を最小限に抑えることです。(別名、熱心な読み込みと遅延読み込み。)
問題: Linq は結合を使用して目標を達成します。すべてと同様に、それはトレードオフです。取得するクエリは少なくなりましたが、これらの結合されたクエリはより複雑でコストがかかります。SQL Profiler に入ると、これが明確になります。
したがって、結合なしでプリロードするためのLinqのオプションが必要です。これは可能ですか?これは次のようになります。
多対多の関係を提供するテーブル、Persons
テーブルItems
、およびテーブルがあります。PersonItems
Persons のコレクションをロードするとき、PersonItems と Items もすべて積極的にロードしたいと思います。
Linq は現在、2 つの結合を含む 1 つの大きなクエリでこれを行います。個人用、それらの個人に関連するすべての PersonItems 用、およびそれらの PersonItems に関連するすべてのアイテム用の 3 つの非結合クエリです。次に、Linq はそれらを関連するエンティティに自動的に配置します。
これらはそれぞれ、高速なファイアホース タイプのクエリになります。長期的には、予測可能な Web スケールのパフォーマンスが可能になります。
それが行われたのを見たことがありますか?