Automapper Entity Framework 核心包含过滤器映射问题

Automapper Entity Framework Core Include Filter Mapping Issue

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

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;
 }
  1. 当你使用ProjectTo扩展方法时,不需要使用 Include。因为查询和映射在 DataBase.
  2. 中执行
  3. 您可以将 SkillGroups 映射到 List<SkillGroupModel> 而不需要 映射到 SkillGroupModel 然后 List<SkillGroupModel>
public List<SkillGroupModel> GetAllSkillGroupSkills()
{
    return _context.SkillGroups.Where(x => !x.IsDeleted)
                .ProjectTo<List<SkillGroupModel>>(_mapper.ConfigurationProvider).ToList();
}