使用AutoMapper将带Include的IQueryable数据库实体投影到领域实体
使用AutoMapper投影带多层关联的数据库实体到领域实体
首先看你已经写出的EF Core查询代码,已经正确包含了多层关联的实体:
IQueryable<DBTypeEntity> allItems = _dbContext.DBType .Include(e => e.A) .Include(e => e.B) .ThenInclude(e => e.C) .Include(e => e.D) .ThenInclude(ac => ac.E);
接着你用AutoMapper的ProjectTo方法做投影转换:
var result = allItems.ProjectTo<DBTypeDomain>(_typeMapper.ConfigurationProvider);
关于映射配置的部分,这里给你几个关键的配置思路和示例,确保关联属性能正确映射:
- 如果
DBTypeDomain的A属性和DBTypeEntity的A属性结构匹配(或者已经为这两个类型创建了基础映射),AutoMapper会自动完成同名属性的映射,不需要额外配置; - 如果需要自定义映射逻辑(比如字段名不一致、需要类型转换),可以用
MapFrom指定映射规则:CreateMap<DBTypeEntity, DBTypeDomain>() // 自定义A属性的映射逻辑,示例为直接映射,可替换为你的业务逻辑 .ForMember(dest => dest.A, opt => opt.MapFrom(src => src.A)) // 对于多层关联的B->C、D->E,只要你为嵌套类型创建了对应映射(比如BEntity到BDomain、CEntity到CDomain),AutoMapper会自动递归处理 .ForMember(dest => dest.B, opt => opt.MapFrom(src => src.B)) .ForMember(dest => dest.D, opt => opt.MapFrom(src => src.D)); - 额外提示:使用
ProjectTo时,EF Core会将投影逻辑转换成SQL查询,因此你其实不需要提前用Include加载所有关联项(除非后续要在内存中使用未映射的关联数据),AutoMapper会根据映射配置自动生成所需的关联查询,这样能避免加载冗余数据,提升查询性能。
另外要记得为所有嵌套的关联类型创建基础映射,比如:
CreateMap<AEntity, ADomain>(); CreateMap<BEntity, BDomain>(); CreateMap<CEntity, CDomain>(); CreateMap<DEntity, DDomain>(); CreateMap<EEntity, EDomain>();
这样AutoMapper才能完整地将多层关联的数据库实体投影到对应的领域对象中。
内容的提问来源于stack exchange,提问作者Mohammed Elrasheed Osman
相关产品推荐
相关产品推荐

