C# 自动映射将嵌套列表对象映射到与父对象相同的对象

C# 自动映射将嵌套列表对象映射到与父对象相同的对象,c#,.net,.net-core,automapper,C#,.net,.net Core,Automapper,我有三个对象,父对象,子对象,和新对象。由于我在弃用父项中的字段时做了一些中间工作,子项与父项基本相同。目前,Parent映射到NewObject很好,但是我还需要将Parent中的Child对象的内部列表映射到NewObject,因此映射返回一个NewObject列表。下面是一个例子 public class Parent { public string Code { get; set; } public string Name { get; set; } public

我有三个对象,
父对象
子对象
,和
新对象
。由于我在弃用
父项
中的字段时做了一些中间工作,
子项
父项
基本相同。目前,
Parent
映射到
NewObject
很好,但是我还需要将
Parent
中的
Child
对象的内部列表映射到
NewObject
,因此映射返回一个
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; }
}
当我将其映射到
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;
}
您可以按如下方式使用
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));
    }
}
现在,您可以使用将
Parent
转换为
List

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

完整的代码是可用的。

这是非常容易做到的摆脱AutoMapper。做一个手动映射-只需要几行代码。使用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();
var myFlattened = mapper.Map<Parent, List<New>>(parent);
var myFlattenedParent = mapper.Map<Parent, New>(parent);
myFlattened.Insert(0, myFlattenedParent);