Automapper 将嵌套列表对象映射到与父对象相同的对象

Automapper Map Nested List Object to Same Object as Parent

我有三个对象,ParentChildNewObject。由于在我弃用 Parent 中的字段时进行了一些中介工作,Child 基本上与 Parent 相同。目前,Parent 映射到 NewObject 就好了,但我还需要将 Parent 内的 Child 对象的内部列表映射到 NewObject,所以映射 returns NewObject 的列表。下面是一个例子

public class Parent {
    public string Code { get; set; }
    public string Name { get; set; }
    public List<Child> Children { get; set; }
}

public class Child {
    public string Code { get; set; }
    public string Name { get; set; }
}

public class New {
    public string NewCode { get; set; }
    public string NewName { get; set; }
}

所以如果我有以下 Parent 对象:

{
    "code": "abcd",
    "name": "parent",
    "children": [
        {
            "code": "efg",
            "name": "child1"
        },
        {
            "code": "xyz",
            "name": "child2"
        }
    ]
}

当我把它映射到NewObject时,结果应该是

[
    {
        "newCode": "abcd",
        "newName": "parent"
    },
    {
        "newCode": "efg",
        "newName": "child1"
    },
    {
        "newCode": "xyz",
        "newName": "child2"
    }
]

有没有办法只使用 Automapper 来做到这一点?还是我需要使用额外的方法?

没有直接的方法可以做到这一点,没有AutoMapper你可以尝试这样的事情。

public static List<Child> ToNew(Parent parent)    {
    List<Child> result = parent.Children.ToList();
    result.Insert(0, new Child{
        Name = parent.Name, Code = parent.Code
    });
    return result;
}

这将为您提供 ListChild 个对象,然后您可以将其映射到 ListNew 个对象。

CreateMap<List<Child>, List<New>>();

可以使用AutoMapper如下。首先将以下映射添加到您的映射配置文件中。

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Parent, List<New>>()
            .AfterMap((src, dest, context) => context.Mapper.Map(src.Children, dest));
        CreateMap<Child, New>()
            .ForMember(dest => dest.NewName, opt => opt.MapFrom(src => src.Name))
            .ForMember(dest => dest.NewCode, opt => opt.MapFrom(src => src.Code));
        CreateMap<Parent, New>()
            .ForMember(dest => dest.NewName, opt => opt.MapFrom(src => src.Name))
            .ForMember(dest => dest.NewCode, opt => opt.MapFrom(src => src.Code));
    }
}

然后使用配置文件创建映射器。

// Manually create the mapper using the Profile
var mapper = new MapperConfiguration(cfg => cfg.AddProfile(new MappingProfile())).CreateMapper();

现在您可以使用

Parent转换为List<New>
var myFlattened = mapper.Map<Parent, List<New>>(parent);

也将父属性映射到 New,并将其插入第一个列表。

var myFlattenedParent = mapper.Map<Parent, New>(parent);
myFlattened.Insert(0, myFlattenedParent);

完整代码可用here