繁体   English   中英

AutoMapper 在映射列表时忽略属性

[英]AutoMapper ignore properties while mapping a list

AutoMapper 是否可以在映射列表时忽略某些属性? 例如,我有两个类 Metadata 和 MetadataInput。

两者都具有相同的字段,除了目的地“MetadataInput”,它有一个额外的字段。

Mapper.CreateMap <IList<Metadata>, IList<MetadataInput>>()

我尝试使用 formember 选项,但它会生成错误,可能是因为当您想映射列表时无法使用该属性? 如果是,是否有替代解决方案?

正如 Darin Dimitrov 所建议的,您不应该尝试映射列表或集合。

如果它们之间有 1 -> 1 的关系,只需制作一个地图,如:

Mapper.CreateMap<Metadata, MetadataInput>().ForMember(s => s.Property, t => t.Ignore());

然后您可以使用您的列表并将其选择到另一个列表。

var metadataList = new List<Metadata>();

var meatadataInputList = metadataList.Select(p => Mapper.Map<MetadataInput>(p).ToList();

感谢您的有用评论。 因为这两个列表在映射之前已经制作好了,所以我是这样做的:

从数据库中获取列表:

List<Metadata> metadatas = _Metadataservice.GetList(_Collectionservice.Get("Koekelare").ID).ToList();

创建映射器(感谢指出我的错误):

Mapper.CreateMap<Metadata, MetadataInput>().ForMember(s => s.Property, t => t.Ignore());

创建一个新列表并一一映射新的(单个)值:

List<MetadataInput> meta = new List<MetadataInput>();
for (int i = 0; i < e.Count; i++)
{
  meta.Add(Mapper.Map<Metadata, MetadataInput>(metadatas[i], input.Metadatas[i]));
}

有人可以确认这是一个好方法吗?

使用此映射器配置来获得所需的结果:

Mapper.CreateMap<Output, Input>().ForMember(s => s.InputProperty1, t => t.Ignore());
Mapper.CreateMap<Output, Input>().ForMember(s => s.InputProperty2, t => t.Ignore());
Mapper.CreateMap<Input, Output>();
listOfItems = Mapper.Map<List<Input>, List<Output>>(InputListObject);

正如其他人建议的那样,我们应该避免映射列表和集合。 为了忽略所有未映射的属性,以下对我有用。

 CreateMap<Metadata, MetadataInput>()
        .ForMember(dest => dest.Id, o => o.MapFrom(src => src.sourceIdentifier))
        .ForMember(dest => dest.Name, o => o.MapFrom(src => src.sourceName))
        .ForAllOtherMembers(opts => opts.Ignore());

ForAllOtherMembers 应该是方法链中的最后一个。

暂无
暂无

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

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