2013-02-17 82 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