【发布时间】:2020-02-24 19:37:32
【问题描述】:
我有一个多层次的查询,包括:
var itemsToday = DatabaseContext.Items
.Where(f => f.StartTime > DateTime.Today && f.StartTime < DateTime.Today.AddDays(1))
.Include(x => x.LocalStats).ThenInclude(x=>x.StatType1)
.Include(x => x.LocalStats).ThenInclude(x=>x.StatType2)
.Include(x => x.LocalStats).ThenInclude(x=>x.StatType3)
.Include(x => x.LocalStats).ThenInclude(x=>x.StatType4)
.Include(x => x.LocalStats).ThenInclude(x=>x.StatType5)
.Include(x => x.LocalStats).ThenInclude(x=>x.StatType6)
.Include(x => x.LocalStats).ThenInclude(x=>x.StatType7)
.Include(x => x.LocalStats).ThenInclude(x=>x.StatType8)
.Include(x => x.LocalStats).ThenInclude(x=>x.StatType9)
.Include(x => x.LocalDetails)
...
.OrderBy(f=>f.SomeOrderingCriterion);
还有比这更多的包含。当然,这会导致 EF Core 3.0 在 SQL 查询中生成 许多 连接,这意味着它需要永远执行(检索 200 条记录需要 25 多秒)。
我试过用.Include(x => x.LocalStats.StatType1)的格式代替Include和ThenInclude,但是结果是一样的。
有什么方法可以提高效率吗?文档建议:
具有大量
Include运算符的 LINQ 查询可能需要分解为多个单独的 LINQ 查询,以避免笛卡尔爆炸问题。
但我没有看到任何关于如何实际完成此操作的解释。
【问题讨论】:
-
@Silvermind 我不确定我是否完全理解你所说的,但我确实需要我包含的所有数据。有些东西我没有包括在内,因为我现在不需要它们。不幸的是,这些对象又大又复杂。
-
@thedarkspoon 我猜它会生成左连接?左连接太多,无法正确优化查询,这就是性能体验不佳的原因。
-
@thedarkspoon 你对此有什么了解吗?我也想知道有什么替代方法,因为以前的版本确实整合了这些类型的 JOIN。
-
@Siege21x 查看我刚刚发布的答案 :)
标签: c# linq asp.net-core ef-core-3.0