AutoMapper ITypeConverter问题

问题描述

我有以下型号:

public class DeviceSuspensionRequest : BaseEntity
{
    //.....
    public DeviceSuspensionRequestState State { get; set; }
    //.....
}

public class RequestDto : BaseEntity
{
    //.....
    public RequestStatusDto State { get; set; }
    //.....
}

以及以下AutoMapper配置文件类:

public class AutoMapperEFRequest : AutoMapper.Profile
{
    public AutoMapperEFRequest()
    {
        CreateMap<DeviceSuspensionRequestState,RequestStatusDto>().ConvertUsing<SuspensionStatusConverter>();

        CreateMap<DeviceSuspensionRequest,RequestDto>()
            //.....
            ;

    }

    public class SuspensionStatusConverter : ITypeConverter<DeviceSuspensionRequestState,RequestStatusDto>
    {

        public RequestStatusDto Convert(DeviceSuspensionRequestState source,RequestStatusDto destination,ResolutionContext context)
        {
            switch (source)
            {
                case DeviceSuspensionRequestState.RequestSuspensionState:
                    return RequestStatusDto.RequestActive;
                    break;
                case DeviceSuspensionRequestState.SuspendedState:
                    return RequestStatusDto.Accepted;
                    break;
                case DeviceSuspensionRequestState.RequestReactivationState:
                    return RequestStatusDto.ReactivationRequest;
                    break;
                case DeviceSuspensionRequestState.ReactivatedState:
                    return RequestStatusDto.Reactivated;
                    break;
                case DeviceSuspensionRequestState.CancelBySuperadminState:
                    return RequestStatusDto.Cancelled;
                    break;
                case DeviceSuspensionRequestState.CancelByCompanyadminState:
                    return RequestStatusDto.Cancelled;
                    break;
                default:
                    return RequestStatusDto.UnkNown;
                    break;
            }
        }
    }
}

地图:

    _mapperConfig = new MapperConfiguration(cfg =>
    {
        cfg.AddProfile<AutoMapperEFRequest>();
    });

    _mapperConfig.AssertConfigurationIsValid();

已通过

但是当我尝试执行以下操作时:

    var query =
        (from suspensionRequest in _context.DeviceSuspensionRequests select suspensionRequest).ProjectTo<RequestDto>(_mapperConfig)
        .OrderBy(p => p.RequestDateTime)
        ;

它引发以下ArgumentException异常:

“参数类型不匹配”

什么不正确?

解决方法

在AM 10中,ProjectTo将默认使用基础数字值映射您的枚举,因此,如果这些值匹配,则该映射将在没有类型转换器的情况下工作。否则,您需要基于Expression的{​​{1}}重载。正如the docs所说,任何其他重载都仅对ConvertUsing有效。