2015-05-12 2 views
5

AutoMapper IQueryable внутренней линии Project().To<TViewModel>().SingleOrDefault() бросает это исключение:AutoMapper IQueryable Extension кидает "Невозможно сравнить элементы типа <Complex Type>" с

Не можете сравнить элементы типа «App.Domain.MyComplexType. Поддерживаются только примитивные типы, типы перечислений и типы сущностей.

У меня есть эта модель:

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;} 
} 

я использую AutoMapper настроить отображение из IQueryable<MyEntityType> в ViewModel:

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

Тогда я стараюсь, чтобы получить один элемент, как это:

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

Я получаю вышеуказанное исключение, когда SingleOrDefault() называется, так что, по-видимому

Сейчас я работаю вокруг этого первого вызова SingleOrDefault(), а затем делает отображение, это работает:

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

Другие сообщения в основном говорят, что ошибка возникает внезапно при попытке сравнить сложный тип EF с нулевым, как, например, в предложении Where, но это, по-видимому, здесь не так.

+0

Вы пробовали ручную проекцию? Использование оператора Select LINQ? –

+0

Нет, я в настоящее время работаю над своей проблемой, отбрасывая 'Project(). To()' и отображение готового объекта в памяти ('var myItem = Mapper.Map (myContext.Find (id));'). Это работает. – AunAun

+0

Да, но вы пробовали использовать только Select? –

ответ

4

LINQ для объектов не может выполнить сравнение (нулевая проверка) для сложных типов, как вы предложили. Например, это не работает ...

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

По умолчанию Automapper пытается отобразить нулевые значения источника как нули, а иногда добавляет аналогичные условия в генерируемом выражении при использовании Project().To<>() или Mapper.Engine.CreateMapExpression<,>().

В моем случае я отображал весь сложный тип в свою собственную модель и не использовал выравнивание свойств. Это значение конфигурации решается вопрос для меня ...

Mapper.AllowNullDestinationValues = false; 

Вы можете попытаться вручную создать выражение отображения с помощью CreateMapExpression<TSource,TDest>() и искать нулевые проверки сложного типа, чтобы увидеть, если это та же самая ситуация.