首页 > 解决方案 > 自动映射到多个子类型

问题描述

对于要映射到使用 Automapper 的结果,我进行了一些间接操作。在下面的示例中,LabDetailsIntermediate结果包含两个 EF Core 模型。然后我想将它们映射到另一个结构中,但我无法让投影正常工作。

为了CovidRoomDetailsDTO记录,MaxPhase2属性应该来自Covid元素,然后Phase属性应该来自Phase模型。

如果我不使用自动映射器,我基本上会这样做:

from r in Lab.AsNoTracking()
from p in CovidSitePhase.Where(x => x.SiteId == 60)
join c in LabSpaceSafeDistance on r.TririgaId equals c.TririgaId
select new RoomDetailsDTO {
    Covid = new CovidRoomDetailsDTO {
        MaxPhase2 = c.MaxPeople,
        Phase = p.Phase
    }
};

这是我的类型和当前代码的内容。这显然是一个更大的查询的一部分,我刚刚把它分解成一个我无法工作的部分。

async Task Main() {
    var query = from r in Lab.AsNoTracking()
                from p in CovidSitePhase.Where(x => x.SiteId == 60)
                join c in LabSpaceSafeDistance on r.TririgaId equals c.TririgaId
                select new LabDetailsIntermediate {
                    Covid = c,
                    Phase = p
                };

    var mapper = CreateMapper();

    var data = await query
        .ProjectTo<RoomDetailsDTO>(mapper.ConfigurationProvider)
        .FirstOrDefaultAsync();

    JsonSerializer.Serialize(data, data.GetType(), new JsonSerializerOptions {
        WriteIndented = true,
        IgnoreNullValues = true
    }).Dump();
}

IMapper CreateMapper() {
    var config = new MapperConfiguration(cfg => {
        cfg.CreateMap<LabDetailsIntermediate, RoomDetailsDTO>()
            .IncludeMembers(x => x.Covid);

        cfg.CreateMap<LabSpaceSafeDistance, RoomDetailsDTO>();
        cfg.CreateMap<LabSpaceSafeDistance, CovidRoomDetailsDTO>();
    });

    return config.CreateMapper();
}

public sealed record RoomDetailsDTO {
    public CovidRoomDetailsDTO Covid { get; init; }
}

public sealed record CovidRoomDetailsDTO {
    public int MaxPhase2 { get; set; }
    public int Phase { get; init; }
}

public sealed class LabDetailsIntermediate {
    public LabSpaceSafeDistance Covid { get; set; }
    public CovidSitePhase Phase { get; init; }
}

标签: automapperautomapper-10

解决方案


推荐阅读