DataTable上的复杂GROUP BY

我有一个复杂的实体CostPageDTO ,如下所示:

 public class CostPageDTO { public string CostPageNumber { get; set; } public string Description { get; set; } public char OrderType { get; set; } public string VendorName { get; set; } public List Items { get; set; } } public class ItemDTO { public string BrandCode { get; set; } public string ItemDescription { get; set; } public string ItemID { get; set; } } 

我们需要从数据表创建List 。 我开始如下所示:但我不知道如何在此处应用GROUP BY子句在List创建List

 DataTable table = new DataTable(); SqlDataReader reader = command.ExecuteReader(); table.Load(reader); reader.Close(); List costPages = new List(); Parallel.ForEach(table.AsEnumerable(), (dr) => { costPages.Add(new CostPageDTO() { CostPageNumber = dr[0].ToString(), Description = dr[1].ToString(), OrderType = Convert.ToChar(dr[2].ToString()), VendorName = dr[3].ToString() }); }); 
  1. 我们如何从DataTable创建所需的List

参考

  1. 如何将DataTable转换为通用列表?

我假设您的数据库查询返回CostPage和Item之间的连接。 如果是这种情况,首先必须将行分组以获取CostPage的值,在该项目之后获取DTO类型。 我真的怀疑你会看到并行化代码的好处。

您的代码应该大致如下所示:

 costPages = table.AsEnumerable().GroupBy(dr=> new { CostPageNumber = dr[0].ToString(), Description = dr[1].ToString(), OrderType = Convert.ToChar(dr[2].ToString()), VendorName = dr[3].ToString() }) .Select(x => new CostPageDTO(){ CostPageNumber = x.Key.CostPageNumber, Description = x.Key.Description, OrderType = x.Key.OrderType, VendorName = x.Key.VendorName, Items = x.Select(dr=> new ItemDTO{ //ItemDTO mapping goes here ItemID=dr[Constants.SearchPage.ITMID].ToString() }).ToList() }).ToList();