Automapper Map ICollection <t>到单个具体对象

时间:2017-10-23 09:02:55

标签: c# mapping automapper automapper-6

如何使用automapper将对象集合映射到具体类型的单个对象?

样品:

型号:

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

DTO:

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

我尝试使用以下映射配置将SystemOptionsModel的ICollection映射到一个SystemOptionsDto:

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

结果我得到了一个DTO列表,其中包含Source Collection中每个Item的一个Item。

我也尝试过这个:

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。

1 个答案:

答案 0 :(得分:0)

根据解释,如果集合包含多个OptionID等于&#34; someValue&#34;的项目,则不清楚如何转换值。也许这是不可能的。 解决方案是:

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