私は[並べ替えのために、次のAutomapperマッピングを実行しようとしています:Automapper発現マッピング
public class ServerObject
{
public KeyValuePairEx TestEnumKVP { get; set; }
}
:として定義
Expression<Func<ServerObject, object>> serverQueryable = x => x.TestEnumKVP.Value;
Mapper.Map<Expression<Func<ServerObject, object>>, Expression<Func<DatabaseObject, object>>(serverQueryable)
は私がDatabaseObject式にServerObject式をマップする
ServerObject
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オプションでカスタムリゾルバを使用してください。 '
DatabaseObject.TestEnumIdにマップするには、ServerObject.TestEnumKVP.Valueが必要です。私は式のマッピングが逆になっていることを認識しています。そのため、MapはDatabaseObjectからServerObjectになっています。私はこれに多くの時間を費やしており、マッピングをどのように機能させるかについては犠牲になっています!
NB。私はAutoMapper 6.1.1を使用しています
助けていただければ幸いです!
ありがとうございました。私は提案したようにForPathに式を変更しようとしました。別のエラーが発生しました... "InvalidOperationException:SourceMemberはnullにはなりませんソースタイプ:ServerObject、宛先タイプ:DatabaseObject、プロパティ:TestEnumKVP" – sjr
ForPathで動作するように式のマッピングが更新されていないようです。 TestEnumKVPのリゾルバが必要です。それは基本的なマップを動作させるでしょうが、私はそれが表現マッピングに役立つかどうかは分かりません。 –
これは、Expression Mappingでサポートされている構成ではない可能性があると考えます。試行:config.CreateMap()。ForMember(dest => dest.TestEnumKVP.Value、opt => opt.ResolveUsing(x =>新しいKeyValuePairEx()(Value = x.TestEnumId)));エラーは "トップレベルのメンバーに解決しなければならない、子オブジェクトではない..."です。今では多くの組み合わせを試しました。 –
sjr