如何通过AutoMapper关联Doctor与Appointment表并解决映射类型错误?
解决AutoMapper映射DoctorName时的类型转换错误
问题描述
我有Doctor和Appointment两张数据表,需要通过AutoMapper将Appointment映射到AvailableAppointmentDto,其中DTO包含DoctorName字段,要从关联的Doctor表中获取该字段值。但配置映射后系统提示无法将‘bool’转换为‘System.Func<char,bool>’,明明两个字段都是字符串,这让我很困惑。
相关代码如下:
Doctor模型
public class Doctor { public int Id { get; set; } public string Name { get; set; } public string Title { get; set; } public Department Department { get; set; } public int DepartmentId { get; set; } }
Appointment模型
public class Appointment { public int Id { get; set; } public DateTime AppointmentDate { get; set; } public int DoctorId { get; set; } public Doctor Doctor { get; set; } public int? PatientId { get; set; } public Patient Patient { get; set; } }
AvailableAppointmentDto
public class AvailableAppointmentDto { public int Id { get; set; } public DateTime AppointmentDate { get; set; } public int DoctorId { get; set; } public string DoctorName { get; set; } }
错误的映射配置
CreateMap<Appointment, AvailableAppointmentDto>() .ForMember(dep => dep.DoctorName, opt => opt.MapFrom(src => src.Doctor.Name.Where(src.DoctorId==src.Doctor.Id)));
错误原因分析
你这里的问题出在Where方法的使用上:
src.Doctor.Name是字符串类型,字符串的Where方法需要传入一个Func<char, bool>的委托(用来筛选字符串中的字符);- 但你传入的
src.DoctorId==src.Doctor.Id是一个布尔表达式,直接返回true/false,和Where要求的参数类型不匹配,所以才会出现类型转换错误。
另外,Appointment和Doctor是一对一的关联关系(每个预约对应一个医生),完全不需要用Where来筛选,直接获取关联医生的Name即可。
正确的映射配置
修改映射代码,去掉多余的Where逻辑,直接映射src.Doctor.Name:
CreateMap<Appointment, AvailableAppointmentDto>() .ForMember(dest => dest.DoctorName, opt => opt.MapFrom(src => src.Doctor.Name));
如果担心src.Doctor可能为null(比如数据库中没有关联的医生数据),可以添加空值保护:
CreateMap<Appointment, AvailableAppointmentDto>() .ForMember(dest => dest.DoctorName, opt => opt.MapFrom(src => src.Doctor != null ? src.Doctor.Name : string.Empty));
补充:批量映射的正确方式
最后需要注意,当你需要批量映射预约列表时,要将结果转换为IEnumerable<AvailableAppointmentDto>类型,示例代码如下:
var returnAppointments = _mapper.Map<IEnumerable<AvailableAppointmentDto>>(availableAppointments);
内容的提问来源于stack exchange,提问作者Timuçin Çiçek
相关产品推荐
相关产品推荐

