DataTable上的复杂GROUP BY

时间:2013-12-09 13:42:04

标签: c# linq

我有一个复杂的实体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<ItemDTO> Items { get; set; }
}

public class ItemDTO
{
    public string BrandCode { get; set; }
    public string ItemDescription { get; set; }
    public string ItemID { get; set; }
}

我们需要从List<CostPageDTO>创建datatable。我开始如下所示:但我不知道如何在此处应用GROUP BY子句在CostPageDTO中创建List<ItemDTO>

DataTable table = new DataTable();
SqlDataReader reader = command.ExecuteReader();
table.Load(reader);
reader.Close();

List<CostPageDTO> costPages = new List<CostPageDTO>();
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
  2. 创建所需的List

    参考

    1. How do you convert a DataTable into a generic list?

1 个答案:

答案 0 :(得分:1)

我假设您的数据库查询返回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();