EF Core 3,优化大量 Include/ThenInclude

2023-11-22

我有一个这样的查询

return await _ctx.Activities
            .Include(a => a.Attributes)
            .Include(a => a.Roles)
            .Include(a => a.Bookmarks)
            .Include(a => a.VideoMetas)
                .ThenInclude(vm => vm.Instances)
            .Include(a => a.ImageMetas)
                .ThenInclude(im => im.Instances)
            .Include(a => a.Procedure)
                .ThenInclude(p => p.Attributes)
            .FirstOrDefaultAsync(a => a.Id == id);

结果发现速度非常慢。在EF 6你可以做.Include(v => v.VideoMetas.Select(vm => vm.Instances)这有点快(我猜,还没有看过 SQL Profiler 和实际查询)。我该如何优化呢?我也可以使用EF Plus它在哪里有.IncludeOptimized()但没有版本.ThenInclude()。我听说我可以使用.Select代替.Include()但真的不知道如何在这个查询中处理它。


您需要将其拆分为多个查询,以提高性能。 您可以为此使用显式加载。 这不是最漂亮的解决方案,但它确实有效。希望 EF 5 中出现更简单的解决方案。

我猜测哪些字段是集合,哪些是“正常”条目,但类似这样:

var activity = await _ctx.Activities.FindAsync(Id);

await context.Entry(activity)
    .Collection(a => a.Attributes)
    .LoadAsync();

await context.Entry(activity)
    .Collection(a => a.Roles)
    .LoadAsync();

await context.Entry(activity)
    .Collection(a => a.Bookmarks)
    .LoadAsync();

await context.Entry(activity)
    .Collection(a => a.VideoMetas)
    .Query()
    .Include(vm => vm.Instances)
    .LoadAsync();
 
await context.Entry(activity)
    .Collection(a => a.ImageMetas)
    .Query()
    .Include(im => im.Instances)
    .LoadAsync();

await context.Entry(activity)
    .Reference(a => a.Procedure)
    .Query()
    .Include(p => p.Attributes)
    .LoadAsync();

return activity;

更新:从 EF Core 5 开始,Microsoft 添加了.AsSplitQuery()这允许通过急切加载来减少冗长的操作!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF Core 3,优化大量 Include/ThenInclude 的相关文章

随机推荐