Vb.net 按列分组,然后将每个组添加到datatable,然后添加到数据集中
对这样的事情,最好的办法是什么 这是我的数据表Vb.net 按列分组,然后将每个组添加到datatable,然后添加到数据集中,vb.net,linq,datatable,group-by,dataset,Vb.net,Linq,Datatable,Group By,Dataset,对这样的事情,最好的办法是什么 这是我的数据表 ╔═══════════════╦═══════════════╦═══════════════╗ ║ Product Name ║ Product Price ║ Product Group ║ ╠═══════════════╬═══════════════╬═══════════════╣ ║ Skirt Red ║ 99 ║ 1 ║ ║ Jeans Blue ║
╔═══════════════╦═══════════════╦═══════════════╗
║ Product Name ║ Product Price ║ Product Group ║
╠═══════════════╬═══════════════╬═══════════════╣
║ Skirt Red ║ 99 ║ 1 ║
║ Jeans Blue ║ 49 ║ 2 ║
║ Jeans Black ║ 49 ║ 2 ║
║ Skirt Blue ║ 99 ║ 1 ║
║ T-shirt White ║ 20 ║ 3 ║
║ T-shirt Green ║ 20 ║ 3 ║
║ Jeans Grey ║ 49 ║ 2 ║
╚═══════════════╩═══════════════╩═══════════════╝
我将使用LINQ按product group列对该datatable进行分组,以生成以下组
Group #1
╔═══════════════╦═══════════════╦
║ Product Name ║ Product Price ║
╠═══════════════╬═══════════════╬
║ Skirt Red ║ 99 ║
║ Skirt Blue ║ 99 ║
╚═══════════════╩═══════════════╩
Group #2
╔═══════════════╦═══════════════╦
║ Product Name ║ Product Price ║
╠═══════════════╬═══════════════╬
║ Jeans Blue ║ 49 ║
║ Jeans Black ║ 49 ║
║ Jeans Grey ║ 49 ║
╚═══════════════╩═══════════════╩
Group #3
╔═══════════════╦═══════════════╦
║ Product Name ║ Product Price ║
╠═══════════════╬═══════════════╬
║ T-Shirt White ║ 20 ║
║ T-Shirt Green ║ 20 ║
╚═══════════════╩═══════════════╩
现在问题是
Dim ds As New DataSet
Dim query = From r In bookedorders Group By key = r.Field(Of Integer)("productgroup") Into Group
For Each grp In query
Dim x As New DataTable
x = grp.Group.CopyToDataTable()
ds.Tables.Add(x)
Next
现在这一切都正常了,只是我不确定如何选择特定的列,比如我不想显示结果数据表中的所有列。如何使用LINQ按产品组列分组 听起来你所要求的并不是严格意义上的LINQ团队。linq中的分组意味着您从一列中获取值,并以某种方式(求和、平均)组合它们,并为每个唯一标识符显示一条记录。在您的示例中,如果您想显示每个组的平均价格,则需要一个组,但从您的解释来看,您只需要3个不同的select语句,如下所示:
Dim query = From t in bookedorders Where t.Item("productgroup") = r select t
Dim tempDT as new DataTable
tempDT.Merge(query.CopyToDataTable)
tempDT.Columns.Remove("GroupID")
tempDt.Name = "ProductID" & r
ds.Tables.Add(tempDT)
从r.groupID=YourControlVariable的产品中的r选择r.ProductName、r.ProductPrice
其中,您的控制变量将是每个组ID。此LINQ将为您提供您概述的三个表,从那里您可以调用CopyToDataTable
函数来处理LINQ返回的内容,并将临时数据表设置为该函数的输出
2.如何从结果组中删除产品组列
参考第1点的linq,通过只列出要选择的列,实际上将忽略任何未列出的列
3.如何将每个组添加到单独的数据表,然后将所有表添加到单个数据集
如果您知道将要使用的groupID,那么在一个循环中完成这项任务将相当简单。您可以在循环内创建一个临时数据表,并将其设置为包含来自点1的linq结果。获得结果后,您可以命名该表并将其添加到数据集,循环完成后,您的临时数据表将消失,但您可以在数据集本身中按名称引用它们
4.假设结果组中有我不想显示的列,我如何隐藏它们
参考第1/2点
编辑:
正如您所描述的问题,我认为在LINQ中使用group by会使问题变得不必要的复杂,因为如果要提取单个属性,就必须处理匿名类型。下面是一个简短的代码段,它获取所有不同的组ID,然后使用LINQ提取每种类型的所有产品,将它们添加到一个表中,然后将命名表添加到数据集中。您可以删除名称部分,或者将其更改为您想要的任何名称,这其实并不重要
Dim ds As New DataSet
Dim groupIDs = From r in bookedorders Select r.Item("productgroup") Distinct
for each r in groupIDs
Dim query = From t in bookedorders Where t.Item("productgroup") = r select t.Item("ProductName"), t.Item("ProductPrice")
If query IsNot Nothing AndAlso query.Any Then
Dim tempDT as new DataTable
tempDT.Merge(query.CopyToDataTable)
tempDt.Name = "ProductID" & r
ds.Tables.Add(tempDT)
End IF
Next
我对您的示例做了一点修改,以使用Item collection,但这仅在bookedorders
是datatable时才有效
编辑#2:
在考虑了一下之后,上面的示例仍然会为您提供一个匿名类型集合。这样你就可以改变
Dim query = From t in bookedorders Where t.Item("productgroup") = r select t.Item("ProductName"), t.Item("ProductPrice")
线条看起来像:
Dim query = From t in bookedorders Where t.Item("productgroup") = r select t
Dim tempDT as new DataTable
tempDT.Merge(query.CopyToDataTable)
tempDT.Columns.Remove("GroupID")
tempDt.Name = "ProductID" & r
ds.Tables.Add(tempDT)
然后在你的if语句里面会是这样的:
Dim query = From t in bookedorders Where t.Item("productgroup") = r select t
Dim tempDT as new DataTable
tempDT.Merge(query.CopyToDataTable)
tempDT.Columns.Remove("GroupID")
tempDt.Name = "ProductID" & r
ds.Tables.Add(tempDT)
同样,只有当您通过一个datatable获得一个可枚举(Of DataRow)作为您的结果时,这才有效,这是最好的。1.如何使用LINQ按产品组列进行分组 听起来你所要求的并不是严格意义上的LINQ团队。linq中的分组意味着您从一列中获取值,并以某种方式(求和、平均)组合它们,并为每个唯一标识符显示一条记录。在您的示例中,如果您想显示每个组的平均价格,则需要一个组,但从您的解释来看,您只需要3个不同的select语句,如下所示:
Dim query = From t in bookedorders Where t.Item("productgroup") = r select t
Dim tempDT as new DataTable
tempDT.Merge(query.CopyToDataTable)
tempDT.Columns.Remove("GroupID")
tempDt.Name = "ProductID" & r
ds.Tables.Add(tempDT)
从r.groupID=YourControlVariable的产品中的r选择r.ProductName、r.ProductPrice
其中,您的控制变量将是每个组ID。此LINQ将为您提供您概述的三个表,从那里您可以调用CopyToDataTable
函数来处理LINQ返回的内容,并将临时数据表设置为该函数的输出
2.如何从结果组中删除产品组列
参考第1点的linq,通过只列出要选择的列,实际上将忽略任何未列出的列
3.如何将每个组添加到单独的数据表,然后将所有表添加到单个数据集
如果您知道将要使用的groupID,那么在一个循环中完成这项任务将相当简单。您可以在循环内创建一个临时数据表,并将其设置为包含来自点1的linq结果。获得结果后,您可以命名该表并将其添加到数据集,循环完成后,您的临时数据表将消失,但您可以在数据集本身中按名称引用它们
4.假设结果组中有我不想显示的列,我如何隐藏它们
参考第1/2点
编辑:
正如您所描述的问题,我认为在LINQ中使用group by会使问题变得不必要的复杂,因为如果要提取单个属性,就必须处理匿名类型。下面是一个简短的代码段,它获取所有不同的组ID,然后使用LINQ提取每种类型的所有产品,将它们添加到一个表中,然后将命名表添加到数据集中。您可以删除名称部分或将其更改为任何内容