Consulta de LINQ recursiva: seleccionar elemento y todos los niños con subchildren

¿Hay alguna forma de escribir una consulta LINQ (o estilo de procedimiento) que pueda seleccionar un elemento y todos los elementos secundarios con una consulta? Tengo entidad:

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

Tengo una ID, así que quiero seleccionar Comment with ID y todos sus hijos con subchildren. Ejemplo:

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

Si ID == 1, entonces quiero una lista de 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))); } 

Tu clase de comentarios se puede ver como un gráfico y tu problema es un problema transversal de gráficos .

Realmente no se pueden definir problemas recursivos a través de linq, pero el problema se puede resolver fácilmente mediante un método recursivo simple.