我有一个对象:
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文件夹,以及所有文件,尽管我的文件夹结构中有多层。
遗憾的是,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也对此不支持。
如果您可以使用对数据库的多个查询来执行此“代码”(或者完全不使用数据库),请参阅golergka的注释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句