using System.Collections.Generic;
public static void Main()
DataTable dt = new DataTable("table");
dt.Columns.Add("ParentId", typeof(int));
dt.Columns.Add("ParentName", typeof(string));
dt.Columns.Add("ChildId", typeof(string));
dt.Columns.Add("ChildName", typeof(string));
DataRow row1 = dt.NewRow();
row1["ParentName"] = "John";
row1["ChildName"] = "Suzy";
DataRow row2 = dt.NewRow();
row2["ParentName"] = "John";
row2["ChildName"] = "James";
DataRow row3 = dt.NewRow();
row3["ParentName"] = "Sally";
row3["ChildName"] = "Suzy";
DataRow row4 = dt.NewRow();
row4["ParentName"] = "Sally";
row4["ChildName"] = "James";
var query = dt.AsEnumerable().GroupBy(x => x.Field<string>("ParentName"))
Child = x.Select(z => new Children
ChildID = z.Field<string>("ChildId"),
Name = z.Field<string>("ChildName")
foreach (var item in query)
Console.WriteLine("ParentName : {0}", item.Name);
foreach (var child in item.Child)
Console.WriteLine("\tChildId: {0}", child.ChildID);
Console.WriteLine("\tChildName: {0}", child.Name);
Console.WriteLine("-----------------------------------");
public string Name = string.Empty;
public List<Children> Child = new List<Children>();
public string ChildID = "0";
public string Name = string.Empty;