首页 > 解决方案 > AutoMapper,将嵌套的集合集合映射到 List

问题描述

我刚刚开始在 asp net core 项目上使用 AutoMapper,我正在尝试将具有对象集合的对象映射到实体。

来源

public class MyClass
    {
        public List<MyCollection> MyCollections { get; set; }
    }

    public class MyCollection
    {
        public int CollectionId { get; set; }
        public List<Description> Descriptions { get; set; }
    }

    public class Description
    {
        public int DescriptionId { get; set; }
        public string Text { get; set; }
    }

目的地

 public class DescriptionToCollection
    {
        public int DescriptionId { get; set; }
        public int CollectionId { get; set; }
    }

我玩过 ConvertUsing 这样的想法,但我无法让它发挥作用。

CreateMap<MyClass, List<DescriptionToCollection>>()
             .ConvertUsing(source => source.MyCollections.Select(x =>x.Description.Select(y=> new DescriptionToCollection{ DescriptionId=y.DescriptionId,CollectionId=x.CollectionId}).ToList()
             ));

搜索 AutoMappers 文档和互联网,我找不到与我的问题类似的任何内容。非常感谢任何帮助。

标签: c#.net-coreautomapper

解决方案


尝试实现 ITypeConverter,按照示例代码:

你的课

    public class Class1
    {
        public List<Class2> class2 { get; set; }
    }

    public class Class2
    {
        public int CollectionId { get; set; }
        public List<Class3> class3 { get; set; }
    }

    public class Class3
    {
        public int DescriptionId { get; set; }
        public string Text { get; set; }
    }


    public class ClassDto
    {
        public int DescriptionId { get; set; }
        public int CollectionId { get; set; }
    }

自定义地图

    public class ClassCustomMap : ITypeConverter<Class1, List<ClassDto>>
    {

        public List<ClassDto> Convert(Class1 source, List<ClassDto> destination, ResolutionContext context)
        {
            var classDtoList = new List<ClassDto>();
            foreach (var item in source.class2)
            {
                var collectionID = item.CollectionId;
                foreach (var obj in item.class3)
                {
                    var classDto = new ClassDto();
                    classDto.CollectionId = collectionID;
                    classDto.DescriptionId = obj.DescriptionId;

                    classDtoList.Add(classDto);
                }
            }

            return classDtoList;
        }
    }

映射声明

    CreateMap<Class1, List<ClassDto>>().ConvertUsing<ClassCustomMap>();

如何使用它

    var class2 = new Class2();
    class2.CollectionId = 2;

    var class3 = new Class3();
    class3.DescriptionId = 1;
    class3.Text = "test";

    class2.class3 = new System.Collections.Generic.List<Class3>() { class3 };

    var class1 = new Class1();
    class1.class2 = new System.Collections.Generic.List<Class2>() { class2 };

    var result = mapper.Map<List<ClassDto>>(class1);

为清楚起见和简化,我使用了显式循环,如果您愿意,可以使用 LinQ 和 Lambda 优化转换函数


推荐阅读