c# - Automapper 将 ICollection<T> 映射到单个具体对象

标签 c# mapping automapper automapper-6

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

示例:

型号:

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 列表,源集合中的每个项目都有一个项目。

我也试过这个:

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。

最佳答案

从解释来看,如果集合包含多个 OptionID 等于“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()));

关于c# - Automapper 将 ICollection<T> 映射到单个具体对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46885506/

相关文章:

c# - 从 C++ COM DLL 回调到 C# 应用程序

c# - 使用 Automapper 在 DataReader 中将字符串转换为 bool 值

c# - 使用 AutoMapper 将对象的属性映射到字符串

c# - 如何使用AutoMapper?

c# - 从泛型父类(super class)定义中获取正确的子类方法

c# - 区域布局忽略的环境变量

ruby-on-rails - 为什么多字段映射不适用于 elasticsearch 的轮胎 gem ?

image - 需要更好的算法来找到具有最小距离的 2 组点之间的映射

c# - 从本地 Service Fabric 应用程序登录到 Azure 存储模拟器

python:如何为字母赋值?