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

时间:2019-09-17 19:39:15

标签: c# asp.net-web-api2 automapper

我正在开发用于管理文件和文件夹的Web应用程序。我将文件和文件夹保存在单独的数据库表中,但是当我从后端检索文件夹时,它可以包含子项,可以是文件夹或文件。因此,我不想使用前端中的文件和文件夹的单独列表,而希望使用DTO类将它们组合为单个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类中添加了Children属性,但是我不知道如何让所有后续子对象都以递归方式进行映射。

1 个答案:

答案 0 :(得分:0)

我又跑了一圈,想出了这个:

stackBlitz

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