Automapper 将 ICollection<T> 映射到单个具体对象
Automapper Map ICollection<T> to single concrete object
如何使用自动映射器将对象集合映射到具体类型的单个对象?
样本:
型号:
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()));
如何使用自动映射器将对象集合映射到具体类型的单个对象?
样本:
型号:
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()));