递归LINQ查询:选择项目和所有子项的子项

有没有办法编写LINQ(或程序样式)查询,可以选择一个项目和一个查询的所有子项? 我有实体:

public class Comment { public int Id {get;set;} public int ParentId {get;set;} public int Text {get;set;} } 

我有一个ID,所以我想选择带ID的评论及其所有孩子和子女。 例:

 1 -2 --3 -4 -5 --6 2 3 

如果ID == 1,那么我想要1,2,3,4,5,6的列表。

  public class Comment { public int Id { get; set; } public int ParentId { get; set; } public string Text { get; set; } public List Children { get; set; } } class Program { static void Main() { List categories = new List() { new Comment () { Id = 1, Text = "Item 1", ParentId = 0}, new Comment() { Id = 2, Text = "Item 2", ParentId = 0 }, new Comment() { Id = 3, Text = "Item 3", ParentId = 0 }, new Comment() { Id = 4, Text = "Item 1.1", ParentId = 1 }, new Comment() { Id = 5, Text = "Item 3.1", ParentId = 3 }, new Comment() { Id = 6, Text = "Item 1.1.1", ParentId = 4 }, new Comment() { Id = 7, Text = "Item 2.1", ParentId = 2 } }; List hierarchy = new List(); hierarchy = categories .Where(c => c.ParentId == 0) .Select(c => new Comment() { Id = c.Id, Text = c.Text, ParentId = c.ParentId, Children = GetChildren(categories, c.Id) }) .ToList(); HieararchyWalk(hierarchy); Console.ReadLine(); } public static List GetChildren(List comments, int parentId) { return comments .Where(c => c.ParentId == parentId) .Select(c => new Comment { Id = c.Id, Text = c.Text, ParentId = c.ParentId, Children = GetChildren(comments, c.Id) }) .ToList(); } public static void HieararchyWalk(List hierarchy) { if (hierarchy != null) { foreach (var item in hierarchy) { Console.WriteLine(string.Format("{0} {1}", item.Id, item.Text)); HieararchyWalk(item.Children); } } } 
  IEnumerable GetChild(int id) { return table.Where(x => x.ParentID == id || x.Id== id).Union(table.Where(x => x.ParentID == id).SelectMany(y => GetChild(y.Id))); } 

您的评论类可以看作图表,您的问题是图形遍历问题 。

您无法通过linq真正定义递归问题,但可以通过简单的递归方法轻松解决问题。