You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:14:22