私はEF、データベースを最初に持っています。、、の3つのモデルクラスAがBありCます。モデルAには、とのm2m関係がBあり、との関係Bはm2mCです。
A関連するBとのサブセットをリストしていCます。
テストされた環境では、サブセットに約20のモデルがあり、関連するモデルAはごくわずかであり、関連するB場合は、ほとんどの場合1つです。
モデルBには常に1つの関連がありCます。C将来的には1つに関連するものが増えるので、変更したくありませんB。
私の最初のアプローチは次のとおりです。
var listA = new Entities(...).As.Where(...).ToList();
foreach (var objA in listA){
var listC = objA.Bs.ToList().Select(b => b.FirstOrDefault(c => ...)).ToList();
}
約164msかかりました-かなり長いです。
だから私はそれを最適化することについて考えました。
ご覧のとおり、最初の行IQueryable<A>はに変更されていList<A>ます。この瞬間、クエリが実行されると思います。
BsforAとCforを取得したい場合はB、別のクエリが実行されると思います。
Includeそれから私はメソッドを検索して見つけました。2番目のアプローチでは、次のように使用しました。
var listA = new Entities(...).As.Include("Bs.Cs").Where(...).ToList();
foreach (var objA in listA){
var listC = objA.Bs.ToList().Select(b => b.FirstOrDefault(c => ...)).ToList();
}
私の意見では、実行には約10ミリ秒かかるはずですが、現在は550ミリ秒かかります。
As関連Bsのないリストを作成しCsたところ、約10ミリ秒かかります。
私は何が間違っているのですか?
編集:申し訳ありませんが、CはBにFKを持っています。しかし、それは何も変わらないと思います。