2017-06-01 86 views
4

在我只能讀取的遠程數據庫中,每天的每個小時都有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之間變化。 「地毯」和「傀儡」也是相似的;但是他們之間沒有自動連接。除非名稱是_identical_,否則您需要手動映射屬性。 – Flater

+1

到目前爲止你有任何代碼嗎?你如何從數據庫中獲取數據並保存它? –

+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