C# 自动映射表达式映射

C# 自动映射表达式映射,c#,automapper,C#,Automapper,我正在尝试为OrderBy执行以下自动映射: Expression<Func<ServerObject, object>> serverQueryable = x => x.TestEnumKVP.Value; Mapper.Map<Expression<Func<ServerObject, object>>, Expression<Func<DatabaseObject, object>>(serverQuer

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

Expression<Func<ServerObject, object>> serverQueryable = x => x.TestEnumKVP.Value;
Mapper.Map<Expression<Func<ServerObject, object>>, Expression<Func<DatabaseObject, object>>(serverQueryable)
KeyValuePairEx是用于存储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; }
}
数据库对象定义为:

public class ServerObject
{
    public KeyValuePairEx TestEnumKVP { get; set; }
}
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));
});
AutoMapper.Mapper.Initialize(配置=>
{
config.CreateMap().formMember(dest=>dest.TestEnumKVP.Value,opt=>opt.MapFrom(src=>src.TestEnumId));
});
映射失败,原因是:

表达式'dest=>dest.TestEnumKVP.Value'必须解析为顶级成员,而不是任何子对象的属性。在子类型或AfterMap选项上使用自定义解析器。”

我需要ServerObject.TestEnumKVP.Value映射到DatabaseObject.TestEnumId。我知道表达式映射是反向的——因此,映射是从DatabaseObject到ServerObject的。我花了很多时间在这上面,对于如何让映射工作感到困惑

注意。我正在使用AutoMapper 6.1.1


任何帮助都将不胜感激

错误和解决方案就在消息中。忘掉所有的表情吧。这个会员坏了。请尝试使用ForPath。
表达式映射现在支持ForPath。请参阅。

谢谢你,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));
CreateMap().formMember(dest=>dest.TestEnumKVP,opt=>opt.MapFrom(src=>src));
CreateMap().formMember(dest=>dest.Value,opt=>opt.MapFrom(src=>src.TestEnumId));
我开始寻找解决方法,很高兴它是可能的,而且解决方案是如此简洁明了

再次感谢


谢谢你的帮助。我试着按照你的建议将表达式改为ForPath。现在出现不同的错误…”InvalidOperationException:SourceMember不能为null。源类型:ServerObject,目标类型:DatabaseObject,属性:TestEnumKVP“我猜表达式映射未更新以使用ForPath。您需要TestEnumKVP的解析器。这将使基本映射正常工作,但我不确定它是否有助于表达式映射。我认为这可能不是表达式映射支持的配置。尝试:config.CreateMap().formMember(dest=>dest.TestEnumKVP.Value,opt=>opt.resolvesusing(x=>newkeyvaluepairex(){Value=x.TestEnumId}));错误是“必须解析为顶级成员,而不是子对象的…”。现在尝试了这么多组合-几乎是时候放弃了!你没抓住重点。您不能让FormMember for值,仅针对TestEnumKVP。在映射中删除了.Value,但问题与MapFor相同。“'SourceMember cannot be null“我是否需要将字符串(TestEnumId)映射到KeyValuePairEx?感谢您在这方面的指导