将展平对象的属性映射为集合

Posted

技术标签:

【中文标题】将展平对象的属性映射为集合【英文标题】:Mapping flattened object's properties as collection 【发布时间】:2021-11-24 21:58:34 【问题描述】:

我的对象列表看起来像这样:

//SOURCE OBJECT
public class SourceObject

    public string Code  get; set; 
    public string Name  get; set; 
    public string ImageUri1  get; set; 
    public string ImageUri2  get; set; 
    public string ImageUri3  get; set; 
    // etc...


//TARGET OBJECT
public class TargetObject

    public string Code  get; set; 
    public string Name  get; set; 

    public List<TargetObjectImage> Images get;set;


public class TargetObjectImage

    public string Name  get; set; 
    public string ImageUri  get; set; 

我需要使用 TargetObject 的导航属性将 SourceObject 的一些属性映射到嵌套集合 TargetObjectImage。

所以实际上,我想调用“UNPIVOT”操作。 此外,源数据结构并不总是必须存储所有图像,在这种情况下 ImageUri... 属性将为空,不应添加到嵌套集合中。

public class SourceObjectProfile : Profile

    public SourceObjectProfile()
    
        var map = CreateMap<SourceObject, TargetObject>()
        .ForMember(o => o.Name, o => o.MapFrom(m => m.Name))
        .ForMember(o => o.Code, o => o.MapFrom(m => m.Code))
    


我正在使用 AutoMapper。我可以问任何提示吗?

【问题讨论】:

我们可以假设固定大小为 5 张图片,我不需要通用解决方案。 【参考方案1】:

这是工作代码:

    public class CustomResolver : IValueResolver<SourceObject, TargetObject, List<TargetObjectImage>>
    
        public List<TargetObjectImage> Resolve(SourceObject source, TargetObject destination, List<TargetObjectImage> destMember, ResolutionContext context)
        
            return new List<TargetObjectImage>
                        
                            new TargetObjectImage
                            
                                Uri = source.ImageUri1
                            ,
                            new TargetObjectImage
                            
                                Uri = source.ImageUri2
                            ,
                            new TargetObjectImage
                            
                                Uri = source.ImageUri3
                            ,
                        ;     
        
    

    public class SourceObjectProfile : Profile
    
        public SourceObjectProfile()
        
            var map = CreateMap<SourceObject, TargetObject>()
            .ForMember(o => o.Name, o => o.MapFrom(m => m.Name))
            .ForMember(o => o.Code, o => o.MapFrom(m => m.Code))
            .ForMember(o => o.Images, o => o.MapFrom(new CustomResolver()));
        
    

【讨论】:

前两个MapFrom-s 没用。

以上是关于将展平对象的属性映射为集合的主要内容,如果未能解决你的问题,请参考以下文章

[使用Automapper时,我是否也应该展平/映射视图模型的内部objetc?

展平嵌套对象以将其属性映射到目标对象

在 SQLAlchemy 中创建类似集合的映射属性

1-6 hibernate映射集合属性

Hibernate学习笔记 --- 映射基本数据类型的List集合

JPA集合映射