2013-02-17 77 views
1

我有一个文件夹层次结构,其中文件夹可以有一个父文件夹,无限深度。试图让一个选定的对象,可以有无限的嵌套儿童对象的所有儿童

所以... 文件夹A FolderId = 1 ParentFolderId = NULL(顶层)

文件夹B FolderId = 2 ParentFolderId = 1(A下嵌套)

目录C FolderId = 3 ParentFolderId = 2

文件夹d FolderId = 4 ParentFolderId = 3(在乙嵌套)(巢编辑在C)

我想要得到所有的文件夹B(或用户选择的任何文件夹)的孩子,这样我可以删除所有的孩子,但离开父母(除非,当然,顶部级别文件夹被选中)。

这可能是一些相当直接的递归或foreach循环,但我今天早上正在努力!我使用的是C#和EF,所以使用它会最有帮助。如果可能的话,我想把结果作为一个单子列表。

理想情况下,我想将它作为我的自定义文件夹对象的一种方法,以便我拥有的任何文件夹,我只能说Folder.Children()或类似的东西。

夹对象:

public class Folder 
    { 
    public int Id { get; set; } 

    public string Name { get; set; } 
    public string Description { get; set; } 

    public int? ParentId { get; set; } 
    public virtual Folder Parent { get; set; } 

    public virtual ICollection<File> Files { get; set; } 
    } 

预先感谢您。

+0

你可以发布你迄今为止的尝试,以便可以建立一个答案吗? – 2013-02-17 18:24:30

+0

我没有太多。曾尝试使用其他一些StackOverflow问题,但没有太多。 – Josh 2013-02-17 18:28:49

回答

3

这是一个递归的方法,它会做你想做的。你可以用你想获得孩子的文件夹的Id参数来调用这个方法,它会回顾所有的孩子和孩子的孩子,并且马马虎虎。

public List<Folder> GetFolderChildsRecursive(Int32 forlderId) 
{ 
    List<Folder> childsOfFolder = context.Folder.Where(e=>e.ParentId == folderId).ToList(); 
    foreach(Folder child in childsOfFolder) 
    { 
     List<Folder> childs = GetFoldersRecursive(child.Id); 
     childsOfFolder.AddRange(childs); 
    } 
    return childOfFolder; 
} 
+1

@Josh - Maris适合你+1。您可能想要将其更改为使用迭代器块更加灵活,但总体而言,它将按照您的要求进行操作。 – Josh 2013-02-17 18:54:31

+0

抱歉打扰你,但是上下文是什么?你认为你可以更多地解释你的代码吗? – eddy 2016-01-07 17:31:02

+0

@eddy上下文是实现EF DbContext的实例。 – Maris 2016-01-08 08:47:22