2017-06-01 5 views
4

私が読むことができるリモートデータベースでは、1時間ごとに24個の列が連続しています。それらの名前はP1、P2、...、P24となります。類似の名前を持つメンバのマッピングオートマトンの使用

自分のデータベースに値をコピーする必要があります。これは、列名をH1、H2、...、H24と名前を付けました。

リモートマーカをローカルにマップするにはどうすればよいですか?

CreateMap<Data.Context.SomeTableFromRemoteDb, Data.Entity.MyTableInLocaldb>() 
       .ForMember(x => x.H1, y => y.MapFrom(z => z.P1)) 
       .ForMember(x => x.H2, y => y.MapFrom(z => z.P2)) 
       .ForMember(x => x.H3, y => y.MapFrom(z => z.P3)) 
       .ForMember(x => x.H4, y => y.MapFrom(z => z.P4)) 
       .ForMember(x => x.H5, y => y.MapFrom(z => z.P5)) 
       .ForMember(x => x.H6, y => y.MapFrom(z => z.P6)) 
       .ForMember(x => x.H7, y => y.MapFrom(z => z.P7)) 
       .ForMember(x => x.H8, y => y.MapFrom(z => z.P8)) 
       .ForMember(x => x.H9, y => y.MapFrom(z => z.P9)) 
       .ForMember(x => x.H10, y => y.MapFrom(z => z.P10)) 
       .ForMember(x => x.H11, y => y.MapFrom(z => z.P11)) 
       .ForMember(x => x.H12, y => y.MapFrom(z => z.P12)) 
       .ForMember(x => x.H13, y => y.MapFrom(z => z.P13)) 
       .ForMember(x => x.H14, y => y.MapFrom(z => z.P14)) 
       .ForMember(x => x.H15, y => y.MapFrom(z => z.P15)) 
       .ForMember(x => x.H16, y => y.MapFrom(z => z.P16)) 
       .ForMember(x => x.H17, y => y.MapFrom(z => z.P17)) 
       .ForMember(x => x.H18, y => y.MapFrom(z => z.P18)) 
       .ForMember(x => x.H19, y => y.MapFrom(z => z.P19)) 
       .ForMember(x => x.H20, y => y.MapFrom(z => z.P20)) 
       .ForMember(x => x.H21, y => y.MapFrom(z => z.P21)) 
       .ForMember(x => x.H22, y => y.MapFrom(z => z.P22)) 
       .ForMember(x => x.H23, y => y.MapFrom(z => z.P23)) 
       .ForMember(x => x.H24, y => y.MapFrom(z => z.P24)); 

これは現在のコードです。私が尋ねると、私たちはこのようなものに変換することができます:

CreateMap<Data.Context.SomeTableFromRemoteDb, Data.Entity.MyTableInLocaldb>() 
        .ForMember(x => x.ReplaceMemberName(o=> o, "H", "P"), y => y.MapFrom(z => z.P1)) 

Automapperは名前replacemembernameと機能を持っていますが、私が求めているんだ何をしていないようです。

+1

はあまりにも主観的です。繰り返しのパターンが見えますが、コンピュータはありません。その観点から、名前の半分のデータがP2とH2の間で変化します。 「カーペット」と「人形」も半分似ています。そのためにそれらの間に自動接続はありません。名前が同一でない限り、プロパティを手動でマップする必要があります。 – Flater

+1

これまでのコードはありますか?どのようにしてDBからデータを取得して保存しますか? –

+0

@Flatter、あなたは完全に正しいです。私は今それを手動でやっています。しかし1000のプロパティを持っていると考えてください。それを手動で行うのはばかげているでしょう。 Automapperには、パターンにマッチする機能が必要です。多分それはそうし、これが私が求めているものです。 – Doruk

答えて

2

あなたはまさに約ReplaceMemberNameでしたが、正しく使用されていませんでした。マッパー構成全体に適用する必要があります。詳細はhttps://github.com/AutoMapper/AutoMapper/wiki/Configuration#replacing-charactersを参照してください。あなたも、このようなローカルマッパー作成することができます

private static void Main(string[] args) 
    { 
     var a = new Class1 
     { 
      a1 = "1", 
      a2 = "2", 
      a3 = "3", 
      a4 = "4", 
      a5 = "5" 
     }; 

     Mapper.Initialize(config => 
      { 
       config.ReplaceMemberName("a", "b"); 
       config.CreateMap<Class1, Class2>(); 
      } 
     ); 

     var b = Mapper.Map<Class1, Class2>(a); 
    } 

    private class Class1 
    { 
     public string a1; 
     public string a2; 
     public string a3; 
     public string a4; 
     public string a5; 
    } 

    private class Class2 
    { 
     public string b1; 
     public string b2; 
     public string b3; 
     public string b4; 
     public string b5; 
    } 

: "類似"

var config = new MapperConfiguration(c => 
{ 
    c.ReplaceMemberName("a", "b"); 
    c.CreateMap<Class1, Class2>(); 
}); 

var mapper = config.CreateMapper(); 

var b = mapper.Map<Class1, Class2>(a); 
+0

はい@sasha_gud。私はそれについての例を見ましたが、なぜこれが個々のマップに適用されないのか分かりません。それでも私は検索するものに最も近く、私はそれを使うかもしれません。 – Doruk

+0

@Dorukローカルマッパーを作成して、一般的な設定を変更しないようにすることもできます。答えに対応するコードを追加しました。 –

+0

私はそれを試して戻ってくるでしょう。 – Doruk

関連する問題