Automapper实体框架核心包括过滤器映射问题

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

经过一些研究,我知道您不能在实体框架核心子句上使用包含过滤器。我的集合实体Skill有一个软删除标志,我需要从SkillGroup内部的集合中过滤掉该标志。我使用了select创建所需的列表,但是由于类型不同,自动映射器失败。我可以遍历此过程,并按照automapper想要的方式构建它,但是我认为必须有一个更优雅的解决方案,或者我缺少的东西。

public List<SkillGroupModel> GetAllSkillGroupSkills()
    {
        var skillGroups = _context.SkillGroups.Where(x => !x.IsDeleted)
                                            .Select(c => new
                                            {
                                                c,
                                                Skills = c.Skills.Where(i => !i.IsDeleted)
                                            }).AsEnumerable();

        List<SkillGroupModel> rtn = _mapper.Map<List<SkillGroupModel>>(skillGroups);

        //List<SkillGroupModel> rtn = _mapper.Map<List<SkillGroupModel>>(_context.SkillGroups.Include(x => x.Skills.Where(b => !b.IsDeleted).Where(x => !x.IsDeleted));

        return rtn;
    }

编辑-按照评论中的建议,将配置文件更改为MapFrom

public class SkillProfile : Profile
{
    public SkillProfile()
    {
        CreateMap<Skill, SkillModel>()
            .ReverseMap();
        CreateMap<SkillGroup, SkillGroupModel>()
            .ForMember(dest => dest.Skills, conf => conf.MapFrom(source => source.Skills.Where(i => !i.IsDeleted)))
            .ReverseMap();
    }
}

然后将ProjectTo添加到我的子句:

public List<SkillGroupModel> GetAllSkillGroupSkills()
{
    var ef = _context.SkillGroups.Where(x => !x.IsDeleted).Include(x => x.Skills).ProjectTo<SkillGroupModel>(_mapper.ConfigurationProvider);
    List <SkillGroupModel> rtn = _mapper.Map<List<SkillGroupModel>>(ef);

    return rtn;
 }
c# entity-framework-core automapper
1个回答
0
投票
  1. [当您使用ProjectTo扩展方法时,不需要使用Include。因为查询和映射在DataBase中执行。
  2. 您可以将SkillGroups映射到List<SkillGroupModel>,不需要映射到SkillGroupModel然后List<SkillGroupModel>
public List<SkillGroupModel> GetAllSkillGroupSkills()
{
    return _context.SkillGroups.Where(x => !x.IsDeleted)
                .ProjectTo<List<SkillGroupModel>>(_mapper.ConfigurationProvider).ToList();
}
© www.soinside.com 2019 - 2024. All rights reserved.