VB.NET如何按产品名称分组对象列表并将材质属性合并为数组
VB.NET 合并同产品多材质SQL记录实现方案
你现有代码存在两个核心错误:
- 无需先将单条
DataRow转为Product对象:单条SQL记录仅包含单个材质值,无法直接初始化Product类的materials数组属性,此步骤会产生空值或报错 - 分组后构造
Product对象时遗漏了dimension、weight、price三个字段的赋值,且取材质的逻辑错误,应该从原始DataRow中读取material字段值
正确实现代码
' 数据库查询部分保持不变,补充DataTable初始化 Using conn As SqlConnection = New SqlConnection("Data source=db;Initial Catalog=ProductData;Integrated security=True") Dim cmd As New SqlCommand("select * from dbo.Product_data_db", conn) Dim adapter As New SqlDataAdapter(cmd) Dim table As New DataTable() adapter.Fill(table) End Using ' 分组合并逻辑修改如下 Dim products As List(Of Product) = table.AsEnumerable() _ .GroupBy(Function(row) row.Field(Of String)("name")) _ .Select(Function(group) New Product With { .name = group.Key, ' 同产品非材质字段完全一致,取分组第一条记录的值即可 .dimension = group.First().Field(Of Integer)("dimension"), .weight = group.First().Field(Of Double)("weight"), .price = group.First().Field(Of Double)("price"), ' 提取分组内所有材质字段转成字符串数组 .materials = group.Select(Function(row) row.Field(Of String)("material")).ToArray() }).ToList()
实现说明
- 直接对DataTable的行数据按
name字段分组,避免中间多余的Product对象转换 - 利用同产品非材质字段完全一致的特性,取分组第一条记录的对应值赋值即可
- 遍历分组内所有行,提取
material字段值转为数组,赋值给Product的materials属性
内容的提问来源于stack exchange,提问作者BWS
相关产品推荐
相关产品推荐

