2016-04-27 60 views
1

關於AutoMapper的問題。 我正在嘗試使用構造表達式將IQueryable投影到DTO,但結果始終在其字段中爲null。ConstructProjection使用 - 我做錯了什麼?

public class BaseObject { } 
    public class DTO { public string Name { get; set; } } 

.... 

      // create map BaseObject-to-DTO 
      Mapper.CreateMap<BaseObject, DTO>() 
       .ConstructProjectionUsing(s => new DTO 
       { 
        Name = "This name will never appear in DTO" 
       }); 

      // create object array with one element 
      var objects = new [] { new BaseObject() }; 

      var result = objects.AsQueryable().ProjectTo<DTO>(); // here Name = null everywhere 

爲什麼結果中的名稱爲空?

回答

0

ConstructProjectionUsing只接受構造函數,我猜。它可以正常工作:

.ConstructProjectionUsing(s => new DTO("This name will never appear in DTO")) 

回答問題「爲什麼」深藏於Automapper sources中。

1

這是預期的行爲。 AutoMapper試圖構建一個「選擇」投影。沒有AutoMapper一個正常的源/目的投影會是這個樣子的LINQ:

objects.AsQueryable().Select(bo => new DTO { Name = bo.Name }); 

我經過源/目標成員,建立了所謂的在LINQ一個MemberInitExpression。這是構造表達式加上成員初始化,新的+大括號屬性分配。

ConstructProjectionUsing是關於替換成員init表達式的「新」部分:bo => new DTO("I like turtles") { Name = bo.Name };而不是單個成員。對於你正在尋找的,我實際上必須合併兩個成員初始化表達式 - 一個AutoMapper從源/目標屬性構建,以及你在配置中的任何東西。我的頭痛苦思考如何有效地做到這一點。

我可能會拋出一個配置異常,如果你試圖做別的,或者至少有更好的IntelliSense評論。隨時爲此打開GH問題!