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文档和互联网时,我找不到任何与我的问题类似的东西。非常感谢您的帮助。

除了示例代码中的一个拼写错误外,您几乎已经遇到了。因为您没有在顶层进行1:1映射,所以您需要在某个地方进行扁平化,并且您可以使用SelectMany,适当地移动ToList调用。

CreateMap<MyClass, List<DescriptionToCollection>>()
.ConvertUsing(source => source.MyCollections.SelectMany(x => // SelectMany to flatten
x.Descriptions.Select(y => 
new DescriptionToCollection
{
DescriptionId = y.DescriptionId,
CollectionId = x.CollectionId
}
) // ToList used to be here
).ToList()
);

尝试实现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 优化转换函数

您缺少自动映射器的用途。

它应该用于将一种类型的输入对象转换为不同类型的输出对象。

您想要创建一个从MyClass类型到List的映射——这应该被视为投影。

您可以使用LINQ(例如作为MyClass上的扩展方法(来实现这一点:

public static class MyClassExtension
{
public static List<DescriptionToCollection> ToDescriptionToCollection(this MyClass value)
{
return value.MyCollections.SelectMany(mc => mc.Descriptions.Select(d => new DescriptionToCollection()
{
CollectionId = mc.CollectionId,
DescriptionId = d.DescriptionId
})).ToList();
}
}

最新更新