Reputation: 367
I want to return nested list from DataTable. So I am looking for LINQ query for the below scenario
DataTable table = new DataTable();
table.Columns.Add("Header", typeof(string));
table.Columns.Add("RowHeader", typeof(string));
table.Columns.Add("ItemHeader", typeof(string));
table.Columns.Add("Items", typeof(string));
table.Rows.Add("Header1", "RowHeader1", "Item Header1", "Item1, Item2, Items3");
table.Rows.Add("Header1", "RowHeader1", "Item Header2", "Item1, Item2, Items3");
table.Rows.Add("Header1", "RowHeader2", "Item Header3", "Item1, Item2, Items3");
table.Rows.Add("Header2", "RowHeader3", "Item Header4", "Item1, Item2, Items3");
Note : Here items are delimted by commas (,)
public class HeaderClass
{
public string Header { get; set; }
public IEnumerable<RowHeaderClass> RowHeader{ get; set; }
}
public class RowHeaderClass
{
public string Header { get; set; }
public IEnumerable<RowItemsClass> RowItems{ get; set; }
}
public class RowItemsClass
{
public string Item1{ get; set; }
public string Item2{ get; set; }
}
Thanks in advance.
Upvotes: 2
Views: 1253
Reputation: 19544
You class definitions don't seem to be complete - You seem to be missing variables to hold the ItemHeader
and the extra items, but given what you provided, you could do it with something along the lines of:
List<HeaderClass> x = (from row in table.AsEnumerable()
group row by row.Field<string>("Header") into hdr
select new HeaderClass
{
Header = hdr.First().Field<string>("Header"),
RowHeader = (from hdrrow in hdr
group hdrrow by hdrrow.Field<string>("RowHeader") into row
select new RowHeaderClass
{
Header = row.First().Field<string>("RowHeader"),
RowItems = from itemrow in row
select new RowItemsClass
{
Item1 = itemrow.Field<string>("Items").Split(',')[0],
Item2 = itemrow.Field<string>("Items").Split(',')[1]
}
}).ToList()
}).ToList();
Hope this at least helps you move in the right direction!
Upvotes: 1