2015-05-12 4 views
5

AutoMapper IQueryable Erweiterung der Project().To<TViewModel>().SingleOrDefault() diese Ausnahme auslöst:AutoMapper IQueryable Erweiterung wirft "Can not Elemente vom Typ vergleichen <Complex Type>" mit

nicht Elemente vom Typ ‚App.Domain.MyComplexType vergleichen. Nur primitive Typen, Aufzählungstypen und Entitätstypen werden unterstützt.

Ich habe dieses Modell:

public class MyEntityType // this is an entity type on the dbContext 
{ 
    public int Id {get;set; 
    public MyComplexType MyComplexType {get;set;} 
} 

public class MyComplexType // this is a complex type 
{ 
    public decimal Property1 { get; set;} 
    public string Property2 { get;set;} 
} 

public class ViewModel 
{ 
public int Id { get;set;} 
public decimal MyComplexTypeProperty1 { get;set;} 
} 

I AutoMapper Mapping konfigurieren verwenden IQueryable<MyEntityType>-ViewModel:

Mapper.CreateMap<MyEntityType, MyComplexType>(); // I rely on AutoMapper's 
//convention for flattening `source.MyComplexType.Property1` to `dest.MyComplexTypeProperty1' 

Dann versuche ich ein einzelnes Element wie folgt abzurufen:

var myItem = myContext.Where(x => x.Id == id).Project().To<ViewModel>().SingleOrDefault(); 

Ich erhalte die oben genannte Ausnahme, wenn SingleOrDefault() genannt wird, so scheinbar

ich zur Zeit dieses Problem umgehen, indem man zuerst SingleOrDefault() aufrufen und dann die Zuordnung zu tun, das funktioniert:

var myItem = Mapper.Map<ViewModel>(myContext.Find(id)); 

Weitere Beiträge im Grunde sagen, dass der Fehler, der oben entsteht wenn man versucht, einen EF Complex Type mit null zu vergleichen, wie zB in einer Where Klausel, aber das ist hier offenbar nicht der Fall.

+0

Haben Sie eine manuelle Projektion versucht? Verwenden einer SELECT LINQ-Anweisung? –

+0

Nein, ich arbeite derzeit an meinem Problem, indem ich 'Project(). To()' verwerfen und ein fertiges In-Memory-Objekt zuordnen ('var myItem = Mapper.Map (myContext.Find (id));'). Das funktioniert. – AunAun

+0

Ja, aber haben Sie versucht, nur Select zu verwenden? –

Antwort

4

LINQ to entities kann Vergleiche (Nullprüfung) für komplexe Typen nicht ausführen, wie Sie vorgeschlagen haben. Zum Beispiel funktioniert das nicht ...

myContext.Select(i => new 
{ 
    MyComplexType = i.MyComplexType != null ? 
     new MyComplexTypeViewModel() 
     { 
      Property1 = i.MyComplexType.Property1 
     } 
     : null 
}) 

standardmäßig AutoMapper versucht null Quellwert als Nullen abzubilden und fügt manchmal ähnliche Bedingungen in generierten Ausdruck, wenn Project().To<>() oder Mapper.Engine.CreateMapExpression<,>() verwenden.

In meinem Fall habe ich den gesamten komplexen Typ auf sein eigenes Ansichtsmodell abgebildet und nicht die Eigenschaftenabflachung verwendet. Dieser Konfigurationswert löste das Problem für mich ...

Mapper.AllowNullDestinationValues = false; 

Sie können versuchen, manuell Mapping Ausdruck erstellen CreateMapExpression<TSource,TDest>() mit und für null Kontrollen auf komplexe Art zu sehen, ob es die gleiche Situation ist.

Verwandte Themen