web-dev-qa-db-ja.com

オートマッパー式はトップレベルのメンバーに解決する必要があります

オートマッパーを使用して、ソースオブジェクトと宛先オブジェクトをマップしています。それらをマップしている間、以下のエラーが発生します。

式はトップレベルのメンバーに解決される必要があります。パラメータ名:lambdaExpression

問題を解決できません。

私のソースオブジェクトと宛先オブジェクトは次のとおりです。

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.CarsDestination.OutputData.Carsオブジェクト。これで私を助けてくれませんか?

24

あなたが使用している:

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

Destラムダで2レベルを使用しているため、これは機能しません。

Automapperを使用すると、1つのレベルにのみマップできます。問題を解決するには、単一のレベルを使用する必要があります。

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

このように、あなたはあなたの車を目的地に設定することができます。

35
  1. SourceOutputDataの間のマッピングを定義します。

    Mapper.CreateMap<Source, OutputData>();
    
  2. 構成を更新してマップDestination.OutputOutputData

    Mapper.CreateMap<Source, Destination>().ForMember( dest => dest.Output, input => 
        input.MapFrom(s=>Mapper.Map<Source, OutputData>(s))); 
    
16
k0stya

あなたはそのようにそれを行うことができます:

// 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)); 

それが私のやり方です;-)

7
Marcus.D

この質問に関して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の使用をやめるようにしてください。これは廃止されており、まもなくサポートされなくなります。

0
Kevat Shah

これは私のために働いた:

Mapper.CreateMap<Destination, Source>()
    .ForMember(x => x.Cars, x => x.MapFrom(y => y.OutputData.Cars))
    .ReverseMap();
0