正在从DataTable生成嵌套列表

本文关键字:嵌套 列表 DataTable | 更新日期: 2023-09-27 17:59:26

我想从DataTable返回嵌套列表。所以我正在寻找以下场景的LINQ查询

 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");

注:此处项目用逗号(,)表示

  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; }
  }

提前谢谢。

正在从DataTable生成嵌套列表

您的类定义似乎并不完整-您似乎缺少保存ItemHeader和额外项的变量,但考虑到您提供的内容,您可以使用以下内容来完成:

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();

希望这至少能帮助你朝着正确的方向前进!