Automapper - 将两个不同的集合属性映射到一个集合 属性

Automapper - mapping two different collection properties to a single collection property

我正在开发一个用于管理文件和文件夹的 Web 应用程序。我将文件和文件夹保存在单独的数据库表中,但是当我从后端检索文件夹时,它可以包含可以是文件夹或文件的子项。因此,我不想在前端处理单独的文件和文件夹列表,而是想使用 DTO class 将它们组合成一个 Children 属性,它具有文件和文件夹共有的属性。然后我可以只显示单个列表。

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

  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

                }))));

这实际上工作正常,但问题是我想递归地映射每个子文件夹的子文件夹,直到找不到更多子文件夹为止。然后,我可以获得有关后端返回的主文件夹下的整个树的信息,并可以显示有关主文件夹下包含的所有文件和文件夹的信息。

这需要将子项添加到 FolderChildItem DTO。示例中的 Children 项位于顶层返回的 FolderDetail DTO 中,Children 项本身是 FolderChildItem 的集合,可以有自己的子项。我已经向 FolderChildItem class 添加了一个 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;
        }

GetFolderChildItems 函数将递归连接所有子项。