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);