2016-04-27 19 views
1

Frage zum AutoMapper. Ich versuche, IQeryable zu DTO mit Konstruktion Ausdruck zu projizieren, aber Ergebnis immer Null in seinen Feldern.ConstructProjectionUsing - was mache ich falsch?

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 

Warum ist der Name in den Ergebnissen null?

Antwort

0

ConstructProjectionUsing akzeptiert Konstruktor nur, denke ich. Es funktioniert gut mit:

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

Antwort "Warum" liegt tief in AutoMapper sources zu hinterfragen.

1

Dies ist das erwartete Verhalten. AutoMapper versucht, eine "Select" -Projektion zu erstellen. Eine normale Quelle/Ziel-Projektion ohne AutoMapper wäre so etwas wie dies in LINQ aussehen:

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

Ich gehe durch die Quell-/Ziel-Mitglieder und aufzubauen, was als MemberInitExpression in LINQ bekannt ist. Das ist der Konstruktionsausdruck plus Elementinitialisierung, neue + geschweifte Klammereigenschaftszuweisungen.

ConstructProjectionUsing ist über nur den "neuen" Teil des Mitglieds init Ausdruck ersetzen: bo => new DTO("I like turtles") { Name = bo.Name }; und nicht die einzelnen Mitglieder. Nach dem, was Sie suchen, müsste ich eigentlich Merge zwei Mitglied Initialisierungsausdrücke - eine, die AutoMapper baut von den Quell-/Ziel-Eigenschaften und was auch immer Sie in der Konfiguration haben. Mein Kopf schmerzt darüber nachzudenken, wie man das effektiv macht.

Ich könnte wahrscheinlich eine Konfigurationsausnahme werfen, wenn Sie versuchen, etwas anderes zu tun, oder zumindest bessere IntelliSense-Kommentare. Fühlen Sie sich frei, ein GH Problem dafür zu öffnen!