2017-08-21 25 views
0

我試圖執行一個排序依據以下Automapper映射: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是用於存儲Int16值和字符串值的Enumeration的包裝:

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)); 
}); 

映射失敗:

'表達' DEST => dest.TestEnumKVP。值'必須解析爲頂級成員,而不是任何子對象的屬性。改爲在子類型或AfterMap選項上使用自定義解析器。'

我需要ServerObject.TestEnumKVP.Value映射到DatabaseObject.TestEnumId。我知道表達式映射是相反的 - 因此Map是從DatabaseObject到ServerObject的原因。我已經花了很多時間在這方面,並且在如何讓地圖工作的過程中不知所措!

注意:我正在使用AutoMapper 6.1.1

任何幫助,將不勝感激!

回答

0

錯誤和解決方案就在消息中。忘掉所有表達的東西。 ForMember已損壞。改用ForPath代替。 表達式映射現在支持ForPath。請參閱https://github.com/AutoMapper/AutoMapper/issues/2293

+0

感謝您的幫助。我試着按照你的建議改變表達式爲ForPath。不同的錯誤現在...「InvalidOperationException:SourceMember不能爲空。Source Type:ServerObject,Destination Type:DatabaseObject,Property:TestEnumKVP」 – sjr

+0

我猜表達式映射沒有更新以使用ForPath。你需要一個TestEnumKVP的解析器。這將使基本地圖起作用,但我不確定它是否有助於表達式映射。 –

+0

認爲這可能不是受支持的表達式映射配置。嘗試:config.CreateMap ()。ForMember(dest => dest.TestEnumKVP.Value,opt => opt.ResolveUsing(x => new KeyValuePairEx(){Value = x.TestEnumId}));錯誤是「必須解析爲頂級成員而不是子對象...」現在嘗試瞭如此多的組合 - 幾乎是放棄的時間! – sjr

1

謝謝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)); 

我開始尋找解決方法,在這麼高興這是可能的,而且該解決方案是如此的乾淨和簡潔。

再次感謝!