如何通过 AutoMapping 到 Dto 高效地进行具有多个导航/级别的 EFCore 7 查询?

问题描述 投票:0回答:0

我第一次在 Asp.net WebAPI 中的端点上下文中使用 EFCore。 我有一张

Venue
的桌子,我正在尝试:

  • 查询他们
  • 通过 AutoMapper 将它们传送到 Dto/公共模型
  • 返回它们(由框架序列化)

问题是,当使用

.UseLazyLoadingProxies()
时,速度非常慢,可能是因为 AutoMapper 正在访问可查询中每个地点的每个属性,并且这会触发单独的导航查询。

我已经尝试发出此消息并将

.Entity<Venue>().Navigation(x => x.Location).AutoInclude();
添加到配置中。然而,这并不是唯一的财产,我必须为所有财产都这样做。这也不是特别容易维护;因为在添加新的导航项时很容易错过此配置,并且性能影响可能不容易被注意到。

有没有一种方法可以在可维护的庄园中预先加载我知道需要它的查询模型的所有导航属性(及其导航属性)?

查询网址:

using var db = new VenuesContext(Fetch.Lazy);
var query = db.Venues.AsQueryable();
if (manager != null)
    query = query.Where(v => v.Managers.Contains(manager));
if (dataCenter != null)
    query = query.Where(v => v.Location.DataCenter.ToLower() == dataCenter.ToLower());
if (world != null)
    query = query.Where(v => v.Location.World.ToLower() == world.ToLower());
var mapped = query.AsEnumerable().Select(this._modelMapper.Map<Venue>);
return mapped;

场地模型:

[Table("Venues", Schema = nameof(Entities.Venues))]
public class Venue : IEntity, ISecurityScoped
{
    [Key] public string Id { get; init; }
    public string Name { get; set; }
    public DateTimeOffset Added { get; set; }
    public virtual Location Location { get; set; } = new ();
    public Uri Website { get; set; }
    [DeleteBehavior(DeleteBehavior.Cascade)] 
    public virtual List<Opening> Openings { get; set; } = new ();
    public virtual List<string> Managers { get; set; } = new ();    
}

我的DbContext:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("Venues");
        modelBuilder.Entity<Venue>().Navigation(x => x.Location).AutoInclude();
        base.OnModelCreating(modelBuilder);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql("Meow");
        if (_fetchKind == Fetch.Lazy)
            optionsBuilder.UseLazyLoadingProxies();
    }
.net entity-framework-core ef-code-first automapper ef-core-7.0
© www.soinside.com 2019 - 2024. All rights reserved.