Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写递归lambda表达式(LINQ查询)_C#_Linq_Recursion_Lambda - Fatal编程技术网

C# 如何编写递归lambda表达式(LINQ查询)

C# 如何编写递归lambda表达式(LINQ查询),c#,linq,recursion,lambda,C#,Linq,Recursion,Lambda,我有一个目标: 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; } } 公共类文件夹:DBO

我有一个目标:

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; }
}
公共类文件夹:DBObjectBase
{
公共字符串名称{get;set;}
公共列表文件{get;set;}
公用文件夹父文件夹{get;set;}
公共列表子文件夹{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);
var results=DbContext.Set()
.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 20460;俬)
.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 20460;俬)
。其中(f=>f.ParentFolder==null);
上面返回的正是我需要的,但我不喜欢代码,因为如果我想向文件夹结构添加多个层,它会导致问题


你知道我如何写这篇文章吗,所以我得到了所有的子文件夹和所有的文件,尽管我的文件夹结构中有很多层?

遗憾的是,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);
var results=DbContext.Set()
.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 20460;俬)
。其中(f.ParentFolder==null);
如果选择“较高级别”,则所有“较低级别”也包括在内

我想这是因为SQL也不支持这个


如果您可以使用对数据库的多个查询(或者根本不使用数据库)执行此“代码内”操作,请参阅golergka的评论。

您有一个文件夹树,并且希望递归查找所有文件。这可以使用深度优先搜索等算法完成:

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;
        }
    }
}
公共静态IEnumerable GetAllFiles(文件夹)
{
foreach(folder.Files中的var文件)
{
生成返回文件;
}
foreach(folder.ChildFolders中的var nestedFolder)
{
foreach(GetAllFiles(nestedFolder)中的var文件)
{
生成返回文件;
}
}
}

这在C#中不是很好,因为它不支持产生多个结果,但它可以工作。此外,如果您有大量的文件或非常嵌套的文件夹,您可能希望使用更高效的技术(例如使用
队列
)实现此算法.

为什么不使用一个好的旧递归树遍历?看看这个:你能澄清一下:你使用的是DB吗?你想把它转换成一个DB命令吗?我使用的是DB,这是基本查询,我正在从文件夹中选择*f左连接文件项f上的fe。Id=fe.Folder\U IdSuspecting by
DBObjectBase
他使用的是DB后端,所以他想做这件事不是通过代码。。。