C# Automapper-将两个不同的集合属性映射到单个集合属性

C# Automapper-将两个不同的集合属性映射到单个集合属性,c#,asp.net-web-api2,automapper,C#,Asp.net Web Api2,Automapper,我正在开发一个用于管理文件和文件夹的web应用程序。我将文件和文件夹保存在单独的数据库表中,但当我从后端检索文件夹时,它可以有子项,这些子项可以是文件夹或文件。因此,我不想在前端处理单独的文件和文件夹列表,而是希望使用DTO类将它们合并到一个单独的子属性中,该类具有文件和文件夹的公共属性。然后我就可以显示这个列表了 下面是我如何将项目映射到该属性的示例: CreateMap<Folder, FolderDetail>() .ForMember(ds

我正在开发一个用于管理文件和文件夹的web应用程序。我将文件和文件夹保存在单独的数据库表中,但当我从后端检索文件夹时,它可以有子项,这些子项可以是文件夹或文件。因此,我不想在前端处理单独的文件和文件夹列表,而是希望使用DTO类将它们合并到一个单独的子属性中,该类具有文件和文件夹的公共属性。然后我就可以显示这个列表了

下面是我如何将项目映射到该属性的示例:

  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)
),我可以这样做,但是它们如何组合到子列表中呢?我从中找到并创建了这个。我不喜欢实现,但它可能是您所需要的。关于以上问题还有一个答案,你可以考虑