本文介绍了在数据表复杂GROUP BY的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 公共类CostPageDTO 
{
公共字符串CostPageNumber {搞定;组; }
公共字符串描述{搞定;组; }
公共焦炭订单类型{搞定;组; }
公共字符串VENDORNAME {搞定;组; }
公开名单< ItemDTO>项目{搞定;组; }
}

公共类ItemDTO
{
公共字符串BrandCode {搞定;组; }
公共字符串ItemDescription {搞定;组; }
公共字符串项目编号{搞定;组; }
}

我们需要创建一个列表< CostPageDTO> 数据表。我开始在下面列出,但我不知道如何申请GROUP BY子句在这里创建一个列表< ItemDTO> 里面CostPageDTO



  DataTable的表=新的DataTable(); 
SqlDataReader的读卡器= Command.ExecuteReader却();
table.Load(读卡器);
reader.Close();

名单,LT; CostPageDTO> costPages =新的List< CostPageDTO>();
Parallel.ForEach(table.AsEnumerable(),(DR)= GT;
{
costPages.Add(新CostPageDTO()
{
CostPageNumber =博士[ 0]的ToString(),
说明=博士[1]的ToString(),
订单类型= Convert.ToChar(博士[2]的ToString()),
VENDORNAME =博士[ 3]的ToString()
});
});




  1. 我们如何可以创建数据表所需的列表



参考




  1. 如何转换数据表到一个通用的列表?


解决方案

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



您的代码应该大致如下:

  costPages = table.AsEnumerable()GROUPBY(DR =方式>新的
{
CostPageNumber =博士[0]的ToString(),
说明=博士[1]的ToString(),
订单类型= Convert.ToChar(博士[2]的ToString()),
VENDORNAME =博士[3]的ToString()
})
。选择(X =>新建CostPageDTO(){
CostPageNumber = x.Key.CostPageNumber,
说明= x.Key.Description,
订单类型= X。 Key.OrderType,
VENDORNAME = x.Key.VendorName,
项= x.Select(DR = gt;新建ItemDTO {
// ItemDTO映射到这里
项ID =博士[Constants.SearchPage.ITMID]的ToString()
})了ToList()
})了ToList()。


I have a complex entity CostPageDTOas shown below:

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

We need to create a List<CostPageDTO> from a datatable. I started as listed below: but I am not sure how to apply the GROUP BY clause here to create a List<ItemDTO> inside CostPageDTO.

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. How can we create the required List from DataTable

REFERENCES

  1. How do you convert a DataTable into a generic list?
解决方案

I'm assuming your database query returns a join between CostPage and Item.If that's the case, first you have to group your rows to get the values for CostPage, after that project to your DTO type. I really doubt that you'll see much benefit in parallelizing the code.

Your code should look roughly like this:

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

这篇关于在数据表复杂GROUP BY的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-24 21:24