我正在尝试为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
任何帮助将不胜感激!
答案 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。