C# Automapper-将两个不同的集合属性映射到单个集合属性
我正在开发一个用于管理文件和文件夹的web应用程序。我将文件和文件夹保存在单独的数据库表中,但当我从后端检索文件夹时,它可以有子项,这些子项可以是文件夹或文件。因此,我不想在前端处理单独的文件和文件夹列表,而是希望使用DTO类将它们合并到一个单独的子属性中,该类具有文件和文件夹的公共属性。然后我就可以显示这个列表了 下面是我如何将项目映射到该属性的示例:C# Automapper-将两个不同的集合属性映射到单个集合属性,c#,asp.net-web-api2,automapper,C#,Asp.net Web Api2,Automapper,我正在开发一个用于管理文件和文件夹的web应用程序。我将文件和文件夹保存在单独的数据库表中,但当我从后端检索文件夹时,它可以有子项,这些子项可以是文件夹或文件。因此,我不想在前端处理单独的文件和文件夹列表,而是希望使用DTO类将它们合并到一个单独的子属性中,该类具有文件和文件夹的公共属性。然后我就可以显示这个列表了 下面是我如何将项目映射到该属性的示例: CreateMap<Folder, FolderDetail>() .ForMember(ds
CreateMap<Folder, FolderDetail>()
.ForMember(dst => dst.Children, opt => opt.MapFrom(src => src.SubFolders.Select(folder => new FolderChildItem()
{
Id = folder.Id,
ModifiedDate = folder.ModifiedDate,
Name = folder.Name,
Type = "Folder"
}).Concat(src.Files.Select(file => new FolderChildItem()
{
Id = file.Id,
ModifiedDate = file.ModifiedDate,
Name = file.Name,
Type = file.Type
}))));
CreateMap()
.ForMember(dst=>dst.Children,opt=>opt.MapFrom(src=>src.SubFolders.Select(folder=>newfolderchildItem())
{
Id=文件夹.Id,
ModifiedDate=folder.ModifiedDate,
Name=文件夹。Name,
Type=“文件夹”
}).Concat(src.Files.Select(file=>newFolderChildItem())
{
Id=file.Id,
ModifiedDate=file.ModifiedDate,
Name=file.Name,
Type=file.Type
}))));
这实际上可以很好地工作,但问题是我想递归地映射每个子文件夹的子文件夹,一直映射到树下,直到找不到更多的子文件夹为止。然后,我可以在后端返回的主文件夹下包含有关整个树的信息,并可以显示主文件夹下包含的所有文件和文件夹的信息
这需要向FolderChildItem DTO添加一个子项。示例中的子项位于FolderDetail DTO上,该DTO在顶层返回,子项本身是FolderChildItem的集合,可以有自己的子项。我已经向FolderChildItem类添加了一个Children属性,但我不知道如何使该映射递归地用于所有后续子类。我再次尝试了该属性,并得出以下结论:
CreateMap<Folder, FolderDetail>()
.ForMember(dst => dst.Children, opt => opt.MapFrom(src => GetFolderChildItems(src)));
private IEnumerable<FolderChildItem> GetFolderChildItems(Folder src)
{
var folderChildren = src.SubFolders.Select(folder => new FolderChildItem()
{
Id = folder.Id,
ModifiedDate = folder.ModifiedDate,
Name = folder.Name,
Type = "Folder",
Children = GetFolderChildItems(folder)
}).ToList();
var fileChildren = src.Files.Select(file => new FolderChildItem()
{
Id = file.Id,
ModifiedDate = file.ModifiedDate,
Name = file.Name,
Type = file.Type
}).ToList();
var childItems = folderChildren.Concat(fileChildren);
return childItems;
}
CreateMap()
.ForMember(dst=>dst.Children,opt=>opt.MapFrom(src=>GetFolderChildItems(src));
私有IEnumerable GetFolderChildItems(文件夹src)
{
var folderChildren=src.SubFolders.Select(folder=>newfolderchilditem()
{
Id=文件夹.Id,
ModifiedDate=folder.ModifiedDate,
Name=文件夹。Name,
Type=“文件夹”,
Children=GetFolderChildItems(文件夹)
}).ToList();
var fileChildren=src.Files.Select(file=>newfolderchilditem()
{
Id=file.Id,
ModifiedDate=file.ModifiedDate,
Name=file.Name,
Type=file.Type
}).ToList();
var childItems=folderChildren.Concat(fileChildren);
归还物品;
}
GetFolderChildItems函数将递归连接所有子项。您是否可以创建从
子文件夹
和文件
到FolderChildItem
的映射,而不是使用构造函数手动映射它们?然后AutoMapper应该级联您的对象(只要您不使用MaxDepth(int)
),我可以这样做,但是它们如何组合到子列表中呢?我从中找到并创建了这个。我不喜欢实现,但它可能是您所需要的。关于以上问题还有一个答案,你可以考虑