简体   繁体   English

Automapper 地图 ICollection<T> 单个具体对象

[英]Automapper Map ICollection<T> to single concrete object

how can i map a Collection of Objects to a single object of an concrete type using automapper?如何使用 automapper 将对象集合映射到具体类型的单个对象?

Sample:样本:

Model:模型:

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

DTO: DTO:

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

I tried to map ICollection of SystemOptionsModel to one SystemOptionsDto with the following mapping configuration:我尝试使用以下映射配置将 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()));
           });

As result I get a list of DTOs with one Item for each Item in the Source Collection.结果,我得到了一个 DTO 列表,源集合中的每个项目都有一个项目。

i also tried this:我也试过这个:

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

The result is also a List of SystemOptionsDto and not a single SystemOptionsDto.结果也是一个 SystemOptionsDto 列表,而不是单个 SystemOptionsDto。

From explanation it doesn't clear how values should be converted if collection contains more than one item with OptionID equal to "someValue".根据解释,如果集合包含多个 OptionID 等于“someValue”的项目,则不清楚应如何转换值。 Maybe it's impossible.也许这是不可能的。 Solution is:解决办法是:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM