c# - 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 文档和互联网,我找不到与我的问题类似的任何内容。非常感谢任何帮助。
解决方案
尝试实现 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 优化转换函数
推荐阅读
- python - 从第二个字典更新字典键和值
- angular - 在 Angular 7 拦截器中调用异步函数
- php - 消除城市 (PHP)
- android - Android Studio 中不允许迁移到 androidX
- centos - 我怎样才能创建一个centos yum public repo
- elasticsearch - 改善单元测试的弹性搜索启动时间的设置?
- javascript - 如何获取 javascript 函数来删除添加的待办事项?
- java - 等于并与 BigDecimal 比较
- amazon-web-services - 计划 RDS 仅在计划的 Fargate 任务运行时运行
- c++ - 尝试使用 enable_if 启用 SFINAE 时出现“无法重载”错误