我有EF,数据库第一。我有三个模型类:A
,B
和C
。 模型A
与B
和B
具有m2m关系,与C
具有m2m关系。奇怪的EF行为 - 意外的长时间
我在此列出A
的子集以及相关的B
和C
。
在测试环境中,子集中有大约20个模型A
,只有少数具有任何相关的B
,如果有,它在大多数情况下只是一个。
型号B
总是只有一个相关的C
。我不想改变它,因为将来会有更多C
与一个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
为A
和C
为B
,我认为,执行其他查询。
然后我搜索并找到了Include
方法。在第二个Approuch中,我使用它:
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();
}
在我看来,执行应该花费大约10ms,但现在花费550ms。
当我刚刚挂牌As
有关的Bs
和Cs
它需要约10ms。
我在做什么错?
编辑:对不起,C有FK到B.但我不认为它会改变任何东西。
你真的应该调查发射的sql的任何意外的查询。 –