自动映射表达式映射

时间:2017-08-21 17:43:42

标签: c# automapper

我正在尝试为OrderBy执行以下Automapper映射:

Expression<Func<ServerObject, object>> serverQueryable = x => x.TestEnumKVP.Value;
Mapper.Map<Expression<Func<ServerObject, object>>, Expression<Func<DatabaseObject, object>>(serverQueryable)

我想将ServerObject表达式映射到DatabaseObject表达式

ServerObject定义为:

public class ServerObject
{
    public KeyValuePairEx TestEnumKVP { get; set; }
}

KeyValuePairEx是Enumeration的包装器,它存储Int16值和字符串值:

public enum TestEnum : Int16 { Test1, Test2, Test3 }

public class KeyValuePairEx
{
    internal KeyValuePairEx(TestEnum key, string value) { }

    public TestEnum Key { get; set; }
    public string Value { get; set; }
}

DatabaseObject定义为:

public class DatabaseObject
{
    public string TestEnumId { get; set; }
}

我的映射是:

AutoMapper.Mapper.Initialize(config =>
{
    config.CreateMap<DatabaseObject, ServerObject>().ForMember(dest => dest.TestEnumKVP.Value, opt => opt.MapFrom(src => src.TestEnumId));
});

映射失败:

  

'Expression'dest =&gt; dest.TestEnumKVP.Value'必须解析为顶级成员而不是任何子对象的属性。请在子类型或AfterMap选项上使用自定义解析器。'

我需要ServerObject.TestEnumKVP.Value来映射到DatabaseObject.TestEnumId。我知道表达式映射是相反的 - 因此Map从DatabaseObject到ServerObject的原因。我花了很多时间在这上面,并且不知道如何让映射工作!

NB。我正在使用AutoMapper 6.1.1

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

谢谢Lucian,我关注了github链接,Blaise提供的解决方案已经奏效。见下文:

CreateMap<DatabaseObject, ServerObject>().ForMember(dest => dest.TestEnumKVP, opt => opt.MapFrom(src => src));
CreateMap<DatabaseObject, KeyValuePairEx>().ForMember(dest => dest.Value, opt => opt.MapFrom(src => src.TestEnumId));

我开始寻找变通方法,因此很高兴有可能并且解​​决方案非常简洁明了。

  

再次感谢!

答案 1 :(得分:0)

错误和解决方案就在消息中。忘记所有表达的东西。 ForMember坏了。请尝试使用ForPath。 表达式映射现在支持ForPath。请参阅https://github.com/AutoMapper/AutoMapper/issues/2293