c# - 如何使用 EF Core 3.0 使多个包含更高效

标签 c# linq asp.net-core 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,但结果是一样的。

有什么方法可以提高效率吗?文档建议:

LINQ queries with an exceedingly high number of Include operators may need to be broken down into multiple separate LINQ queries in order to avoid the cartesian explosion problem.

但我没有看到任何关于如何实际完成此任务的解释。

最佳答案

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

关于c# - 如何使用 EF Core 3.0 使多个包含更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58609538/

相关文章:

Azure AD B2C 受众验证失败

c# - 使用 C# 在 Excel 图表上显示标签

c# - 仅在 Vista/Windows Server 2008 上出现 P/Invoke 错误

c# - LINQ 查询婴儿步骤

c# - 在 linq 中使用内部连接

.net - 如何使用 LINQ 按对象集合中的属性进行分组?

c# - 远程服务器声明表不存在

c# - 通过monotouch播放.m3u8音频流文件

c# - 启动后更改MVC6的路由集合

asp.net - 如何在不使用 EF 的情况下实现 PATCH HTTP 方法