我有一个对象:
public class Folder : DBObjectBase
{
public string Name { get; set; }
public List<FileEntry> Files { get; set; }
public Folder ParentFolder { get; set; }
public List<Folder> ChildFolders { get; set; }
}
我写了一个查询,检索文件夹结构和每个文件夹中的所有文件:
var results = DbContext.Set<Folder>()
.Include(f => f.ParentFolder)
.Include(f => f.ChildFolders)
.Include(f => f.Files)
.Include(f => f.ChildFolders.Select(f1 => f1.Files))
.Include(f => f.ChildFolders.Select(f1 => f1.ChildFolders).Select(f2 => f.Files))
.Include(f => f.ChildFolders.Select(f1 => f1.ChildFolders).Select(f2 => f.ChildFolders.Select(f3 => f3.Files)))
.Include(f => f.ChildFolders.Select(f1 => f1.ChildFolders).Select(f2 => f.ChildFolders.Select(f3 => f3.ChildFolders.Select(f4 => f4.Files))))
.Include(f => f.ChildFolders.Select(f1 => f1.ChildFolders).Select(f2 => f.ChildFolders.Select(f3 => f3.ChildFolders.Select(f4 => f4.ChildFolders.Select(f5 => f5.Files)))))
.Include(f => f.ChildFolders.Select(f1 => f1.ChildFolders).Select(f2 => f.ChildFolders.Select(f3 => f3.ChildFolders.Select(f4 => f4.ChildFolders.Select(f5 => f5.ChildFolders.Select(f6 => f6.Files))))))
.Where(f => f.ParentFolder == null);
上面的内容正是我所需要的,但我不喜欢这些代码,如果我想在文件夹结构中添加多个图层,会导致问题。
我有什么想法可以写这个,所以我得到所有的Child文件夹,以及所有文件,尽管我的文件夹结构中有多少层?
答案 0 :(得分:1)
可悲的是LINQ AFAIK没有递归支持(我遇到了同样的问题),但你至少可以将它缩短为:
var results = DbContext.Set<Folder>()
.Include(f => f.ParentFolder)
.Include(f => f.Files)
.Include(f => f.ChildFolders.Select(f1 => f1.ChildFolders).Select(f2 => f.ChildFolders.Select(f3 => f3.ChildFolders.Select(f4 => f4.ChildFolders.Select(f5 => f5.ChildFolders.Select(f6 => f6.Files))))))
.Where(f.ParentFolder == null);
如果选择“更高级别”,则还包括所有“较低级别”。
我认为这是因为SQL也不支持这个......
如果您使用对DB的多个查询执行此“在代码中”(或者您根本不使用DB),请参阅golergka的评论。
答案 1 :(得分:0)
您有一个文件夹树,并且您希望以递归方式查找所有文件。这可以使用深度优先搜索等算法来完成:
public static IEnumerable<FileEntry> GetAllFiles(Folder folder)
{
foreach(var file in folder.Files)
{
yield return file;
}
foreach(var nestedFolder in folder.ChildFolders)
{
foreach(var file in GetAllFiles(nestedFolder))
{
yield return file;
}
}
}
这在C#中并不是很漂亮,因为它不支持产生多个结果,但它有效。此外,如果您有大量文件或非常嵌套的文件夹,您可能希望使用更有效的技术(例如使用Queue
)来实现此算法。