我有一个这样的查询
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(使用前将#替换为@)