私はEntityFrameworkProfilerを使用してMVCプロジェクトのデータアクセスをテストしてきましたが、N + 1の問題のために、必要以上に多くのデータベースクエリを実行しているページに出くわしました。
これが私の問題を示す簡単な例です:
var club = this.ActiveClub; // ActiveClub uses code similar to context.Clubs.First()
var members = club.Members.ToList();
return View("MembersWithAddress", members);
ビューはメンバーをループし、各メンバーのナビゲーションプロパティに従って、アドレスも表示します。各アドレス要求により、追加のデータベースクエリが生成されます。
これを解決する1つの方法は、Includeを使用して、必要な追加のテーブルが事前に照会されていることを確認することです。ただし、これは、コンテキストに直接接続されているクラブのObjectSetでのみ実行できるようです。この場合、ActiveClubプロパティは多くのコントローラーで共有されているため、メンバーとアドレステーブルを事前に照会する必要はありません。
次のようなものを使用できるようにしたいと思います。
var members = club.Members.Include("Address").ToList();
ただし、MembersはEntityCollectionであり、Includeメソッドがありません。
メンバーEntityCollectionに強制的にロードし、EFにアドレスもロードするように依頼する方法はありますか?
または、この方法でエンティティのEntityCollectionナビゲーションプロパティを使用していますが、これは非常に悪い考えです。コンテキストから取得するときに、何をロードしているのかを知っておく必要がありますか?