簡體   English   中英

使用valueinjecter將EF4變量對象映射到DTO

[英]EF4 var object mapping to DTO using valueinjecter

我有下面的一個linQ查詢

 var records = (from P in Person
                join B in BankAccount
                on P.ID equals B.PersonID
                select new { P, B}).ToList();

人表有很多字段,但我只需要使用ID和Name。 同樣,對於BankAccount,我只需要使用ID,AccountType和AccountBalance

然后,我使用類似的方法將上述記錄var類型傳遞給另一個映射器類

    public List<CompositeDTO> MapToDto(IEnumerable<object> data)
    {
        foreach (var rec in data) 
        {
         dto.InjectFrom(rec );
         dtoList.Add(dto);
        }
        return dtoList;
    }

其中CompositeDTO如下

public class CompositeDTO 
{
  public int PersonID {get; set;}
  public String PersonName {get; set;}
  public int AccountID {get; set;}
  public String AccountType{get; set;}
  public int AccountBalance{get; set;}
}

問題是我無法使用dto.InjectFrom(rec )將任何值輸入到CompositeDTO類型的對象中

應該怎么做? 此處的文檔僅說明了如何對來自兩個不同源類的一個字段執行此操作。 我錯過了什么嗎? 能做到嗎?

正如我在此線程上閱讀的AutoMapper vs ValueInjecter

您還可以使用ValueInjecter來映射匿名和動態對象

對於AFAIK,必須按照約定僅在不聲明任何自定義映射的情況下完成此操作。 檢查文檔

target.InjectFrom(source)將從源中獲取屬性,並將它們注入到與它們NameType相匹配的目標中

所以在您的情況下,來源是匿名的

 {
   public Person P { get; set; }
   public BankAccount B { get; set; } 
 }

並且目標CompositeDTO沒有名為Person或BankAccount的名為P或B的屬性,因此沒有匹配項


一個可行的例子:

 var source = new { PersonID = 7, PersonName = "Jon" }; var target = new CompositeDTO(); target.InjectFrom(source); 

我認為AutoMapper在這里做得更好。 我使用AutoMapper修改了地圖方法,如下所示

public List<CompositeDTO> MapToDto(IEnumerable<object> data)
{
     dtoList = data.Select(Mapper.DynamicMap<CompositeDTO>).ToList();

    //foreach (var rec in data) 
    //{
    // dto.InjectFrom(rec );
    // dtoList.Add(dto);
    //}
    return dtoList;
}

我要做的就是將linQ查詢中使用的別名添加到CompositeDTO的屬性中,例如P_PersonIDB_AccountType

我認為ValueInjecter應該致力於添加此功能。 我真的很喜歡不必在使用地圖之前就創建地圖,就像當前在非動態類型中在AutoMapper中所做的那樣。 我現在在代碼中使用兩個不同的對象映射器。 那不好嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM