2017-12-07 9 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() 
      ); 

이 문제를 해결하기 위해 추가해야하는 다른 종류의지도를 모르겠습니다. 내가

내 문제를보다 효율적이고 간단한 방법으로 설명 할 해결되지 않았기 때문에 편집을 할

고마워

는, 어쩌면 누군가가 나를 도울 수 있습니다. 컬렉션 안에 복잡한 개체가 있습니다. 이 같은

객체 다음 CompaniesProvideProduct 제품을 판매하고 자세한 내용은이 회사와의 관계를 포함

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

.

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

} 

그런 다음 내 번역의 대상 개체는 다음과 같습니다

나는 목록 DB에서 얻을 내 프로그램에서
public class ProductDto { 
    int product_id {get; set;}; 
    string name {get; set;}; 
    int company_id {get; set;}; 
    decimal price {get; set;}; 

} 

나는 목록에서이 개체를 번역 할. 제품 레코드 1 개에 대해 ProductDto에 대한 추가 기록이 있습니다.

나는 시도했다 :

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

을 그럼 개체 초기화는 다음처럼 보였다 경우 :

- object => List<object>List<object> => List<object> -로 앞서 설명한 때문에 AutoMapper 원하지 않는 개체 목록의 목록을 제공합니다 기본적으로 당신이 명시 적으로 매핑이 필요합니다
 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, 당신이 쓴 것처럼 번역하면 매핑이 작동합니다. 그러나 문제는 다른 Collection 컬렉션을 원하지 않는다는 것입니다. 나는 오직 하나의 컬렉션 만 원한다. 내 ObjB ObjA에서 상속하고 그는 더 자세한 정보를 ObjC ObjB 및 다른 클래스에서 관계입니다.이 ObjC 컬렉션이 있습니다. 내 번역 ObjC 내부에있는 관계의 세부 정보를 ObjB 개체의 컬렉션을 제공합니다. 제 설명이 명확한지는 모르겠습니다. –

+0

감사합니다. @ODawg! 나는 당신의 대답으로 풀 렸습니다! –