2017-10-23 1 views
1

어떻게 오토 데스크를 사용하여 콘크리트 객체의 단일 객체에 객체 컬렉션을 매핑 할 수 있습니까?오토 맵 (Automapper)지도 ICollection <T>을 단일 콘크리트 객체

샘플 :

모델 :

public class SystemOptionsModel 
{ 
    public string OptionID { get; set; } 
    public string OptionValue { get; set; } 
} 

DTO :

CreateMap<SystemOptionsModel, SystemOptionsDto>() 
      .ForMember(dest => dest.Deliverymode, o => 
      { 

       o.Condition((src) => { return src.OptionID.Trim().ToLower().Equals("someString"); }); 
       o.MapFrom(srs => (Deliverymode)Enum.Parse(typeof(Deliverymode), srs.OptionValue.Trim())); 
      }); 
:

public class SystemOptionsDto 
{ 
    public Deliverymode? Deliverymode { get; set; } 
} 

나는 다음과 같은 매핑 구성 하나 SystemOptionsDto에 SystemOptionsModel의 ICollection에 매핑하는 시도

결과적으로 소스 컬렉션의 각 항목에 대해 하나의 항목이있는 DTO 목록을 얻습니다.

CreateMap<SystemOptionsModel, SystemOptionsDto>() 
      .ForMember(dest => dest.Deliverymode, o => 
      { 
       o.MapFrom(src => src.OptionID.Trim().ToLower().Equals("someString") ? (Deliverymode?)Enum.Parse(typeof(Deliverymode), src.OptionValue.Trim()) : null); 
      }); 

결과는 또한 SystemOptionsDto의 목록이 아니라 하나의 SystemOptionsDto입니다 :

나는이 시도했다.

+0

이'src.OptionID.Trim() ToLower는() 같음 (이하 "someString")'항상 false가 될 것입니다. ;) –

+0

물론, 감독 :) ... – macostobu

답변

0

설명에서 "option"이 "someValue"와 같은 둘 이상의 항목이 컬렉션에 포함되어 있으면 값을 변환하는 방법이 명확하지 않습니다. 아마 불가능합니다. 해결 방법은 다음과 같습니다..

cfg.CreateMap<ICollection<SystemOptionsModel>, SystemOptionsDto>() 
    .ForMember(dest => dest.Deliverymode, opt => opt.ResolveUsing(
     src => src.Where(i => i.OptionID.Trim().ToLower() == "someString") 
        .Select(option => (Deliverymode?)Enum.Parse(typeof(Deliverymode), option.OptionValue.Trim())) 
        .FirstOrDefault())); 
+0

고마워요.이 작품은 나를 위해 !! – macostobu