user472269
user472269

Reputation: 367

Building nested List from DataTable

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

Answers (1)

John Bustos
John Bustos

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

Related Questions