【问题标题】:AutoMapper ITypeConverter issueAutoMapper ITypeConverter 问题
【发布时间】:2020-10-08 23:58:54
【问题描述】:

我有以下型号:

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 异常:

'参数类型不匹配'

什么不正确?

【问题讨论】:

  • 你是否暗示异常是由类型转换器引起的?如果有,为什么?
  • 复制会有所帮助。创建一个gist,我们可以执行并看到失败。
  • @devNull 因为如果我添加忽略 State 字段(或重命名),它工作正常
  • @LucianBargaoanu 我得到了以下信息:DeviceSuspensionRequest -&gt; RequestDto (Destination member list)\r\nTms.Core.Domain.Devices.DeviceSuspensionRequest -&gt; Tms.Core.Dto.DeviceManagement.RequestDto (Destination member list)\r\n\r\n
  • 这有什么关系?你可以做一个repro吗?

标签: c# type-conversion automapper data-conversion


【解决方案1】:

在 AM 10 中,ProjectTo 将默认使用基础数值映射您的枚举,因此如果这些值匹配,则映射将在没有类型转换器的情况下工作。否则,您需要基于ExpressionConvertUsing 重载。任何其他重载仅适用于Map,如the docs 所说。

【讨论】:

  • "否则,您需要基于表达式的 ConvertUsing 重载" - 怎么做?你有例子吗?
  • 这里有很多例子,在 AM repo 和其他地方在线。试一试:)
  • 对不起,我可能很愚蠢,但我真的不明白“您需要基于表达式的 ConvertUsing 重载”下的含义。我无法搜索任何内容...据我了解,问题是因为该类型转换器无法处理为 Linq-to-entities,对吧?
  • 是的。但是您必须了解什么是表达式。忘记某些问题的答案。您需要进行一些研究,以便了解文档假定您已经知道的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多