首页 > 解决方案 > 如何使用 EF Core 3.0 使多个包含更高效

问题描述

我有一个多层次的查询,包括:

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 查询,以避免笛卡尔爆炸问题。

但我没有看到任何关于如何实际实现这一点的解释。

标签: c#linqasp.net-coreef-core-3.0

解决方案


最终我最终手动编写了 SQL,我找不到使生成的 SQL 足够高效的方法。还可以考虑考虑优化数据库,例如添加聚集索引。这大大减少了数据库时间。


推荐阅读