我試圖執行一個排序依據以下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
任何幫助,將不勝感激!
感謝您的幫助。我試着按照你的建議改變表達式爲ForPath。不同的錯誤現在...「InvalidOperationException:SourceMember不能爲空。Source Type:ServerObject,Destination Type:DatabaseObject,Property:TestEnumKVP」 – sjr
我猜表達式映射沒有更新以使用ForPath。你需要一個TestEnumKVP的解析器。這將使基本地圖起作用,但我不確定它是否有助於表達式映射。 –
認爲這可能不是受支持的表達式映射配置。嘗試:config.CreateMap()。ForMember(dest => dest.TestEnumKVP.Value,opt => opt.ResolveUsing(x => new KeyValuePairEx(){Value = x.TestEnumId}));錯誤是「必須解析爲頂級成員而不是子對象...」現在嘗試瞭如此多的組合 - 幾乎是放棄的時間! –
sjr