私は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>
ます。この瞬間、クエリが実行されると思います。
Bs
forA
とC
forを取得したい場合は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を持っています。しかし、それは何も変わらないと思います。