Выражение Automapper должно разрешаться в элемент верхнего уровня

Я использую automapper для сопоставления исходных и целевых объектов. Пока я сопоставляю их, я получаю следующую ошибку.

Выражение должно разрешаться в элемент верхнего уровня. Имя параметра: лямбдаэкспрессион

Я не могу решить проблему.

Мои исходные и конечные объекты:

public partial class Source
{
        private Car[] cars;

        public Car[] Cars
        {
            get { return this.cars; }
            set { this.cars = value; }
        }
}

public partial class Destination
{
        private OutputData output;

        public OutputData Output
        {            
            get {  return this.output; }
            set {  this.output= value; }
        }
}

public class OutputData
{
        private List<Cars> cars;

        public Car[] Cars
        {
            get { return this.cars; }
            set { this.cars = value; }
        }
}

Мне нужно сопоставить Source.Cars с объектом Destination.OutputData.Cars. Не могли бы вы помочь мне в этом?


person Sandeep Reddy Pinniti    schedule 24.07.2012    source источник
comment
Не могли бы вы добавить конфигурацию автомаппера?   -  person k0stya    schedule 24.07.2012
comment
Я пытался добавить конфигурацию, выдает ошибку при запуске конфигураций. Моя конфигурация выглядит так, как показано ниже. Выражение 'dest => dest.OutputData.Cars' должно разрешаться в элемент верхнего уровня. Имя параметра: лямбдаэкспрессион   -  person Sandeep Reddy Pinniti    schedule 25.07.2012
comment
Это сработало для меня: Mapper.CreateMap<Destination, Source>().ForMember(x => x.Cars, x => x.MapFrom(y => y.OutputData.Cars)).ReverseMap(); (также опубликовано в ответе ниже)   -  person Dominus.Vobiscum    schedule 14.01.2020


Ответы (5)


Ты используешь :

 Mapper.CreateMap<Source, Destination>()
 .ForMember( dest => dest.OutputData.Cars, 
             input => input.MapFrom(i => i.Cars)); 

Это не сработает, потому что вы используете 2 уровня в лямбде назначения.

С Automapper вы можете сопоставить только 1 уровень. Чтобы устранить проблему, вам нужно использовать один уровень:

 Mapper.CreateMap<Source, Destination>()
 .ForMember( dest => dest.OutputData, 
             input => input.MapFrom(i => new OutputData{Cars=i.Cars})); 

Таким образом, вы можете установить свои автомобили в пункт назначения.

person Patrick Desjardins    schedule 17.10.2012
comment
Также использовал это решение для сопоставления между объектами, где у источника были string somethingKey и string somethingValue, а у получателя - object something { string Key, string Value }. - person st3inn; 10.01.2013
comment
Отличный ответ!! - person Ricardo; 19.11.2016

  1. Определите сопоставление между Source и OutputData.

    Mapper.CreateMap<Source, OutputData>();
    
  2. Обновите конфигурацию, чтобы сопоставить Destination.Output с OutputData.

    Mapper.CreateMap<Source, Destination>().ForMember( dest => dest.Output, input => 
        input.MapFrom(s=>Mapper.Map<Source, OutputData>(s))); 
    
person k0stya    schedule 25.07.2012
comment
У меня есть поле в OutputData, которое имеет значение по умолчанию. У меня нет сопоставления для этого поля в источнике. Так что я не нанес на карту. После того, как сопоставление выполнено, мое значение по умолчанию устанавливается на нулевое значение в пункте назначения. Как избежать его установки в нулевое значение. - person Sandeep Reddy Pinniti; 26.07.2012

Вы можете сделать это так:

// First: create mapping for the subtypes
Mapper.CreateMap<Source, OutputData>();

// Then: create the main mapping
Mapper.CreateMap<Source, Destination>().
    // chose the destination-property and map the source itself
    ForMember(dest => dest.Output, x => x.MapFrom(src => src)); 

Это мой способ сделать это ;-)

person Marcus.D    schedule 30.06.2015
comment
Это лучшее решение - person Golan Kiviti; 13.03.2016
comment
Идеально работает, когда вы хотите сопоставить IDataRecord со сложным DTO. - person ironcurtain; 11.10.2017

Это сработало для меня:

Mapper.CreateMap<Destination, Source>()
    .ForMember(x => x.Cars, x => x.MapFrom(y => y.OutputData.Cars))
    .ReverseMap();
person Dominus.Vobiscum    schedule 14.01.2020

Правильный ответ, данный allrameest на этот вопрос, должен помочь: AutoMapper - сопоставление глубокого уровня

Это то, что вам нужно:

Mapper.CreateMap<Source, Destination>()
    .ForMember(dest => dest.OutputData, opt => opt.MapFrom(i => i));
Mapper.CreateMap<Source, OutputData>()
    .ForMember(dest => dest.Cars, opt => opt.MapFrom(i => i.Cars));

При использовании картографа используйте:

var destinationObj = Mapper.Map<Source, Destination>(sourceObj)

где destinationObj — экземпляр Destination, а sourceObj — экземпляр Source.

ПРИМЕЧАНИЕ. На данный момент вам следует попытаться отказаться от использования Mapper.CreateMap, поскольку он устарел и скоро перестанет поддерживаться.

person Kevat Shah    schedule 05.08.2016