ProjectTo<DTO>是否支持属性扁平化?IncludeMembers未生成左连接问题
结论
AutoMapper 的 ProjectTo<DTO> 完全支持属性扁平化映射,你遇到的未生成关联表查询的问题是映射规则配置兼容性导致的。
可行解决方案
方案1:显式指定属性映射(兼容性最好,优先推荐)
直接在Doctor到EmploymentDTO的映射规则中,声明DTO属性对应的关联实体来源,不需要额外配置Hospital到EmploymentDTO的映射:
CreateMap<Doctor, EmploymentDTO>() // 原有Doctor属性可自动匹配无需额外配置 .ForMember(dest => dest.City, opt => opt.MapFrom(src => src.Hospital.City)) .ForMember(dest => dest.Country, opt => opt.MapFrom(src => src.Hospital.Country)) .ForMember(dest => dest.UniversityAffiliated, opt => opt.MapFrom(src => src.Hospital.UniversityAffiliated)) .ForMember(dest => dest.HospitalName, opt => opt.MapFrom(src => src.Hospital.HospitalName)) .ForMember(dest => dest.Province, opt => opt.MapFrom(src => src.Hospital.Province)) // 剩余CN后缀的属性按同样规则配置即可 ;
这种写法EF Core可以100%识别到需要查询Hospital导航属性,自动生成符合预期的LEFT JOIN语句。
方案2:兼容IncludeMembers的调整
如果你要保留IncludeMembers的写法,需要做两处调整:
- 确保使用的AutoMapper版本≥10.0,低版本对
IncludeMembers的投影场景支持存在缺陷 - 给两类映射都添加
AsProjection()显式标记为投影专用配置:
// Doctor实体包含导航属性Hospital CreateMap<Doctor, EmploymentDTO>() .IncludeMembers(t => t.Hospital) .AsProjection(); CreateMap<Hospital, EmploymentDTO>() .AsProjection();
额外排查点
确认你封装的_doctorRepository.Where()方法返回的是原生IQueryable<Doctor>,没有在封装逻辑中提前执行查询、或者过滤掉导航属性的加载配置。
内容的提问来源于stack exchange,提问作者hang
相关产品推荐
相关产品推荐

