获取父节点及其子节点的树结构

时间:2012-07-28 04:13:02

标签: c# linq

请查看下面的表结构:

Folderid                    parentFolderid              Guid
1                           0                           1234
2                           1                           5678
3                           2                           9012
4                           3                           87697
5                           7                           4443 

要求是如果我通过folderId,该函数必须给我所有的guid。

例如:如果我将1传递给函数,我应该获得前四个Guids(父级及其子级)。 我有一个函数,它返回所有guid,如下所示:

public List<Guid> Folders(int folderId)
{ 
    // To get the folderids based on parentfolderid
    var a = entity.Where(x => x.parentfolderId == folderId).FirstOrDefault();
     return a;

}

我只能获得一个级别的ID。

有没有办法让父母,孩子,孙子孙女直到叶子?

2 个答案:

答案 0 :(得分:0)

如果你能把那张桌子拿到课堂上,请看看:

public class Entity
{
    public int ID { get; set; }
    public int ParentID { get; set; }
    public string Name { get; set; }

    public static List<Entity> GetTree(int ID, List<Entity> ListToSearch, bool First = true)
    {
        List<Entity> FilteredEntities = new List<Entity>();

        FilteredEntities.AddRange(ListToSearch.Where<Entity>(x => x.ParentID == ID).ToList<Entity>());

        List<Entity> Temp = new List<Entity>();
        foreach (Entity current in FilteredEntities)
        {
            Temp.AddRange(GetTree(current.ID, ListToSearch, false));
        }

        FilteredEntities.AddRange(Temp);

        if (First)
        {
            FilteredEntities.Add(ListToSearch.Where<Entity>(x => x.ID == ID).Single<Entity>());
        }

        return FilteredEntities;
    }
}

用法:

    List<Entity> filteredEntities = Entity.GetTree(1, entities);
    List<string> onlyTheNames = filteredEntities.Select<Entity, string>(x => x.Name).ToList<string>();

此致

答案 1 :(得分:0)

如果您使用此node class,则可以编写如下代码。

public class Folder
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public Guid SomeGuid { get; set; }
}

和可能的例子是:

var list = new List<Folder>
{
    new Folder {Id = 0, ParentId = null, SomeGuid = new Guid("0000b25b-8538-4b78-818a-9094507e0000") },
    new Folder {Id = 1, ParentId = 0, SomeGuid = new Guid("1000b25b-8538-4b78-818a-9094507e0001") },
    new Folder {Id = 2, ParentId = 1, SomeGuid = new Guid("2000b25b-8538-4b78-818a-9094507e0002") },
    new Folder {Id = 3, ParentId = 1, SomeGuid = new Guid("3000b25b-8538-4b78-818a-9094507e0003") },
    new Folder {Id = 4, ParentId = 2, SomeGuid = new Guid("4000b25b-8538-4b78-818a-9094507e0004") },
    new Folder {Id = 5, ParentId = 3, SomeGuid = new Guid("5000b25b-8538-4b78-818a-9094507e0005") },
    new Folder {Id = 6, ParentId = 0, SomeGuid = new Guid("6000b25b-8538-4b78-818a-9094507e0006") },
    new Folder {Id = 7, ParentId = 4, SomeGuid = new Guid("7000b25b-8538-4b78-818a-9094507e0007") },
    new Folder {Id = 8, ParentId = 3, SomeGuid = new Guid("8000b25b-8538-4b78-818a-9094507e0008") },
};
var rootNode = Node<Folder>.CreateTree(list, n => n.Id, n => n.ParentId).Single();

var firstChild = rootNode.Children.First(); // Id 1
var descendentsOfFirstChild = firstChild.Descendants; // All descendants of node 1