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<CostPageDTO>
。我开始如下所列:但我不确定如何在此处应用 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()
);
);
-
我们如何从 DataTable 创建所需的列表
参考文献
-
How do you convert a DataTable into a generic list?
【问题讨论】:
你是用ef还是linq to sql? 您还应该考虑使用ConcurrentBag<T>
。 List<T>
不是线程安全的。
为什么不将 DAL 函数更改为使用 Linq2SQL 或实体框架,它可以直接返回 List 而不是 DataTable。 List我假设您的数据库查询返回 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的主要内容,如果未能解决你的问题,请参考以下文章
winform中如何对一个 datatable 中的数据 进行 分组统计 需要 count 和group by
inq to datatable group by 多列 实现