gpt4 book ai didi

c# - EF Core 3,优化大量Include/ThenInclude

转载 作者:行者123 更新时间:2023-12-03 16:21:21 29 4
gpt4 key购买 nike

我有一个这样的查询

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 和实际查询 tbh)。我该如何优化?我也可以用 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;

关于c# - EF Core 3,优化大量Include/ThenInclude,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61692619/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com