Linq Query Recursive

This question is taken from Stack Overflow : )..I had taught to myself  writing recursive query with LINQ.

Question Link 

Input : 


public class InputClass
{
public int id { get; set; }
public string text { get; set; }
public string icon { get; set; }
public int? parentId { get; set; }

}

static void Main(string[] args)
{
var inputList = new List<InputClass>();
inputList.Add(new InputClass() { id = 1, text = "Item #1" });
inputList.Add(new InputClass() { id = 2, text = "Item #2" });
inputList.Add(new InputClass() { id = 3, text = "Item #3" });
inputList.Add(new InputClass() { id = 4, text = "SubItem #1", parentId = 1 });
inputList.Add(new InputClass() { id = 5, text = "SubItem #2", parentId = 1 });
inputList.Add(new InputClass() { id = 6, text = "SubItem #3", parentId = 2 });
inputList.Add(new InputClass() { id = 7, text = "Sub-Sub Item #1", parentId = 4 });

}

Output:

write a linq query to generate all child elements when parent id is passed.

Example :  when ParentId is 1 ,then the following output must be produced

ID  Name
4   Subitem #1
5   Subitem #2
7   Sub-Sub Item #1

Note : Id 4 & 5 has parent id of 1 and ID 7 has parent id of 4 which inturn points to parent id 1.

Code :

1.First we will write a method to return list of elements that matches the parent id.

Method :
 private static List<InputClass> GetAllChildElements(int parentid, List<InputClas>input)
 {
 return input.Where(x => x.parentId == parentid).ToList();
 } 
This method would return 4& 5 when parent id is passed as 1. 2.Next we must check if the returned list has any child elements associated with it. In this case returned list Id 4 has a reference to child element 7. we must again execute the same 
query but now the parent id would be returned list Ids.


 private static List<InputClass> GetRecursiveList(int p, List<InputClass> inputList)
 {
 var result = inputList.Where(x => x.parentId == p).ToList();
 var temp = new List<InputClass>();
 foreach (var inputClass in result)
 {
 temp.AddRange(GetRecursiveList(inputClass.id, inputList));
 }
 var t=result.Union(temp);
 return t.ToList();
 }