我有EF,首先是数据库。我有三个模型类A
:B
和C
。模型与A
具有 m2m 关系,B
并且与B
具有 m2m 关系C
。
我列出了A
与相关B
和的子集C
。
在测试环境中,子集中有大约 20 个模型A
,只有少数有任何相关B
,如果有,在大多数情况下它只是一个。
模型B
一直只有一个相关C
的。我不想更改它,因为将来会有更多C
与 one 相关的内容B
。
我的第一种方法是:
var listA = new Entities(...).As.Where(...).ToList();
foreach (var objA in listA){
var listC = objA.Bs.ToList().Select(b => b.FirstOrDefault(c => ...)).ToList();
}
它花了大约 164 毫秒 - 相当长。
所以我想优化它。
如您所见,在第一行IQueryable<A>
更改为List<A>
. 我认为,此时此刻,查询已被执行。
当我想获得Bs
forA
和C
forB
时,我认为会执行另一个查询。
然后我搜索并找到了Include
方法。在第二种方法中,我像这样使用它:
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。但我认为它不会改变任何东西。