使用Automapper从多对多子孙IEnumerable中排除祖父母

时间:2018-08-12 20:17:50

标签: c# linq many-to-many entity-framework-core automapper

在我的上下文中,我有FilterList个实体和Maintainer个实体,它们通过结点FilterListMaintainer实体共享多对多关系。

我正在用下面的Automapper映射填充DTO。

public class ListDetailsDto
{
    ...
    public IEnumerable<ListMaintainerDto> Maintainers { get; set; }
    ...
}

public class ListDetailsDtoMappingProfile : Profile
{
    public ListDetailsDtoMappingProfile() =>
        CreateMap<FilterList, ListDetailsDto>()
            .ForMember(d => d.Maintainers,
                c => c.MapFrom(l => l.FilterListMaintainers.Select(m => m.Maintainer)))
            ...;
}

我也将IEnumerable子DTO映射如下:

public class ListMaintainerDto
{
    ...
    public IEnumerable<MaintainerAdditionalListsDto> AdditionalLists { get; set; }
    ...
}

public class ListMaintainerDtoMappingProfile : Profile
{
    public ListMaintainerDtoMappingProfile() =>
        CreateMap<Maintainer, ListMaintainerDto>()
            .ForMember(d => d.AdditionalLists,
                c => c.MapFrom(m => m.FilterListMaintainers.Select(lm => lm.FilterList)))
            ...;
}

该映射用于类似以下的调用中:

public async Task<ListDetailsDto> GetDetailsAsync(uint id) =>
    await DbContext.FilterLists.ProjectTo<ListDetailsDto>(ConfigurationProvider)
                   .FirstOrDefaultAsync(x => x.Id == id);

问题:

如何最好地将祖父母FilterList从每个孙子的AdditionalLists属性中排除(因为AdditionalLists表示“祖父母列表之外”)?换句话说,返回的ListDetailsDto实例应包含ListMaintainerDto的集合,每个集合都包含自己的列表的集合,但不包括ListDetailsDto表示的列表。

CreateMap<>()调用中是否有某种排除它的方法?还是我需要在调用FirstOrDefaultAsync()之后将其过滤掉(如果是,以async的方式进行清理的干净方法是什么?)?

0 个答案:

没有答案