2017-12-07 2 views
2

私は、単純なDTOオブジェクトのリスト上で翻訳する必要がある複雑なオブジェクトを持っています。オートマトンと複合オブジェクト

マイマップはこれです:私はこのmapper.Map<IList<MyDto>>(my_singol_objA);ようsingolでOBJA を働いているが、私はmapper.Map<IList<MyDto>>(my_list_of_objA);

OBJAのリストで働いていたときに動作しない場合は、このマップは、良い作品

CreateMap<ObjASource, IEnumerable<MyDto>>() 
      .ConvertUsing(source => source.ObjB?.ObjC?.Select(p => new MyDto 
      { 
       field1 = source.field1, 
       field2 = source.field2, 
       field3 = source.field3, 
       field4 = p.fieldX, 
       field5 = p.fieldY 
      }).ToList() 
      ); 

これを修正するために追加しなければならない地図の種類はわかりません。

おかげでみんな

EDITED私はより良い説明したい

を解決し、より簡単な方法私の問題ではなかったので、多分誰かが私を助けることができます。 私はコレクション内に複雑なオブジェクトを持っています。このような

オブジェクト:

public class Product { 
    int product_id {get; set;}; 
    string name {get; set;}; 
    List<CompaniesProvideProduct> company {get; } 
} 

CompaniesProvideProductは、製品を販売し、より多くの詳細を持っている会社との関係が含まれています。

public class CompaniesProvideProduct { 
    int product_id {get; set;}; 
    int company_id {get; set;}; 
    decimal price {get; set;}; 

} 

その後、私の翻訳の宛先オブジェクトは、次のとおりです。私のプログラムで

​​

私は一覧DBから取得し、私はリストにこのオブジェクトを翻訳したいです。私はProductDtoのレコードを1レコード持っています。

私が試した:

CreateMap<Product, ProductDto>(); //to get product_id and name 
CreateMap<CompaniesProvideProduct, ProductDto>(); //to get company_id and price 

CreateMap<Product, IEnumerable<ProductDto>>() 
.ConvertUsing<ProductConverter>(); 

public class ProductConverter : ITypeConverter<Product, IEnumerable<ProductDto>> 
{ 

    IEnumerable<ProductDto> ITypeConverter<Product, IEnumerable<ProductDto>>.Convert(Product source, IEnumerable<ProductDto> destination, ResolutionContext context) 
    { 
     Product prod = source; 
     foreach (var dto in prod.company.Select(e => context.Mapper.Map<ProductDto>(e))) 
     { 
      context.Mapper.Map(prod, dto); 
      yield return dto; 
     } 
    } 
} 

しかし、これは私のために動作しません。誰かが私を助けることができるなら、私はとても幸せになるでしょう。

ありがとうございました。

+0

コレクションは、デフォルトで処理され、それらのマップは必要ありません。 –

+0

ありがとうございます@LucianBargaoanu私はこれを知っていたが、私のマッピングが正しくないと私はエラーが表示されます。 –

答えて

0

@ルシアンが正しいです。コレクションはデフォルトで処理されます。元のマッピングが正しく設定されている場合はobject => list<object>となり、list<object> => list<list<object>>も同様に動作します。私はもっ​​と自分の問題を理解すると思う

 var test = new List<ObjASource> 
     { 
      new ObjASource 
      { 
       field1 = "1", 
       field2 = "2", 
       field3 = "3", 
       ObjB = new ObjB 
       { 
        ObjC = new List<ObjC> 
        { 
         new ObjC 
         { 
          fieldX = "X", 
          fieldY = "Y" 
         } 
        } 
       } 
      } 
     }; 

     var result = Mapper.Map<List<List<MyDto>>>(test); 

UPDATE

だからあなたの更新の質問に基づく:

  expression.CreateMap<ObjASource, List<MyDto>>() 
       .ConvertUsing(source => 
        { 
         return source.ObjB?.ObjC?.Select(p => new MyDto 
         { 
          field1 = source.field1, 
          field2 = source.field2, 
          field3 = source.field3, 
          field4 = p.fieldX, 
          field5 = p.fieldY 
         }) 
         .ToList(); 
        } 
      ); 

はここで働いてサンプルです。

 var mapper = new MapperConfiguration(exp => 
     { 
      exp.CreateMap<List<Product>, List<ProductDto>>() 
       .ConstructUsing(products => products.SelectMany(product => product.company, 
        (product, companiesProvideProduct) => new ProductDto 
        { 
         product_id = product.product_id, 
         name = product.name, 
         company_id = companiesProvideProduct.company_id, 
         price = companiesProvideProduct.price 
        }).ToList()); 

      exp.CreateMap<Product, List<ProductDto>>() 
       .ConvertUsing(product => product.company.Select(provideProduct => new ProductDto 
       { 
        product_id = product.product_id, 
        name = product.name, 
        company_id = provideProduct.company_id, 
        price = provideProduct.price 
       }).ToList()); 
     }).CreateMapper(); 

をそれでは、あなたのオブジェクトの初期化は、次のように見えた場合::

として説明した以前のAutoMapperは、あなたがしたくないオブジェクトのリストの一覧を与えるので - object => List<object>List<object> => List<object> - 基本的には、2つの明示的なマッピングを必要とします
 var productList = new List<Product> 
     { 
      new Product 
      { 
       product_id = 1, 
       name = "test1", 
       company = new List<CompaniesProvideProduct> 
       { 
        new CompaniesProvideProduct 
        { 
         company_id = 1, 
         price = 1.99m, 
         product_id = 1 
        } 
       } 
      }, 
      new Product 
      { 
       product_id = 2, 
       name = "test2", 
       company = new List<CompaniesProvideProduct> 
       { 
        new CompaniesProvideProduct 
        { 
         company_id = 2, 
         price = 1.99m, 
         product_id = 2 
        } 
       } 
      } 
     }; 

マッピングされたオブジェクトは、次のようになります。

var result1 = mapper.Map<List<ProductDto>>(productList); 
var result2 = mapper.Map<List<ProductDto>>(productList.First()); 
+0

ありがとうODawg、あなたが書いたように翻訳すると私のマッピングが機能します。しかし、問題は私が別のコレクションのコレクションを望んでいないということです。私は1つだけのコレクションが欲しい。私のObjBはObjAから継承し、彼は詳細を持っています、ObjCはObjBと別のクラスの関係です。これに対して私はObjCのコレクションを持っています。私の翻訳はObjBの中にある関連の詳細をObjBオブジェクトのコレクションに渡したいと思っています。私の説明が明らかかどうかわかりません。 –

+0

ありがとう@ODawg!私はあなたの答えで解決しました! –

関連する問題