DataTable 上的复杂 GROUP BY

Posted

技术标签:

【中文标题】DataTable 上的复杂 GROUP BY【英文标题】:Complex GROUP BY on DataTable 【发布时间】:2013-12-09 13:42:03 【问题描述】:

我有一个复杂的实体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; 

我们需要从datatable 创建一个List&lt;CostPageDTO&gt;。我开始如下所列:但我不确定如何在此处应用 GROUP BY 子句以在 CostPageDTO 中创建List&lt;ItemDTO&gt;

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()
    );
);
    我们如何从 DataTable 创建所需的列表

参考文献

    How do you convert a DataTable into a generic list?

【问题讨论】:

你是用ef还是linq to sql? 您还应该考虑使用ConcurrentBag&lt;T&gt;List&lt;T&gt; 不是线程安全的。 为什么不将 DAL 函数更改为使用 Linq2SQL 或实体框架,它可以直接返回 List 而不是 DataTable。 List 也不是线程安全的,所以你可以这样使用它。 @Lijo 这样的操作将成为 IO 的瓶颈,而不是处理。可能没有理由并行化这样的事情。您不仅使程序变得更加复杂,而且实际上使程序变慢,这种可能性非常高。最重要的是,其他人已经提到你没有正确同步,所以这甚至不会(必然)产生正确的结果。 @Lijo 您向数据库发出的获取数据的网络请求将比处理结果所花费的时间慢许多数量级。当此处理占执行时间的 0.001% 时,将该时间减少一半或更多,实际上对应用程序的执行时间没有影响。 【参考方案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();

【讨论】:

我在使用 LINQ 进行动态分组时遇到了类似的问题。你能看看here吗?

以上是关于DataTable 上的复杂 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

C#用DataTable实现Group by数据统计

winform中如何对一个 datatable 中的数据 进行 分组统计 需要 count 和group by

datatable GRoup by Lambda 统计

inq to datatable group by 多列 实现

DataTable中Linq查询(where,group by)

20180519001 - DataTable Group by功能参考