2017-06-01 1 views
4

In einer Remote-Datenbank, die ich nur lesen kann, gibt es 24 Spalten in einer Zeile für jede Stunde des Tages. Ihre Namen gehen als P1, P2, ..., P24.Zuordnen von Elementen mit ähnlichen Namen Verwenden von Automapper

Ich muss die Werte in meine eigene db kopieren, die ich Spaltennamen als H1, H2, ..., H24 nannte.

Wie kann ich Auto Mapper verwenden, um Remote-Spalten zu Einheimischen zuordnen?

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

Dies ist der aktuelle Code. Was ich frage ist, können wir es so etwas wie dies zu konvertieren:

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

AutoMapper hat eine Funktion mit dem Namen replacemembername aber es scheint nicht zu sein, was ich suche.

+1

"ähnlich" zu subjektiv ist. Sie sehen ein wiederkehrendes Muster, aber ein Computer nicht. Aus seiner Sicht ändert sich die Hälfte der Daten im Namen zwischen P2 und H2. "Teppich" und "Puppe" sind auch auf halbem Wege ähnlich; aber da gibt es keine automatische Verbindung zwischen ihnen. Wenn die Namen nicht identisch sind, müssen Sie die Eigenschaften manuell zuordnen. – Flater

+1

Haben Sie bisher einen Code? Wie erhalten Sie Daten aus der Datenbank und speichern sie? –

+0

@Flatter, Sie sind völlig richtig. Ich mache es jetzt manuell. Aber bedenke, 1000 Eigenschaften zu haben. Es manuell zu tun wäre absurd. Automapper muss eine Funktion haben, um Muster zu vergleichen. Vielleicht tut es das, und darum bitte ich. – Doruk

Antwort

2

Sie waren fast gleich über ReplaceMemberName, aber es ein bisschen falsch verwendet. Es sollte auf die gesamte Mapper-Konfiguration angewendet werden. Details finden Sie unter 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; 
    } 

Sie können auch lokale Mapper wie folgt erstellen:

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

Ja @sasha_gud. Ich habe ein Beispiel dafür gesehen und weiß nicht, warum dies nicht für einzelne Maps gilt. Trotzdem ist es dem, was ich suche, am nächsten und ich kann es benutzen. – Doruk

+0

@Doruk Sie können auch lokale Mapper erstellen, um die allgemeine Konfiguration zu ändern. Der Antwort wurde der entsprechende Code hinzugefügt. –

+0

ich werde es versuchen und wiederkommen. – Doruk

Verwandte Themen