这种事情的最佳方法是什么?
所以这是我的数据表
╔═══════════════╦═══════════════╦═══════════════╗
║ 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按产品组列对此数据表进行分组,以生成以下组
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
现在这是有效的,但我不知道如何选择特定的列,比如我不想在结果数据表中显示所有列
答案 0 :(得分:1)
1.如何使用LINQ
按产品组列进行分组听起来你所要求的并不是LINQ中的技术组合。 linq中的分组意味着您从一列中获取值并以某种方式组合它们(SUM,Average)并显示每个唯一标识符的一条记录。在您的示例中,如果您想显示每个组的平均价格,那么这将需要一个组,但从您的解释看起来您只需要3个不同的选择语句,如下所示:
From r in products where r.groupID = YourControlVariable select r.ProductName, r.ProductPrice
其中YourControlVariable是每个组ID。这个LINQ会给你你概述的三个表,你可以从那里调用LINQ返回的CopyToDataTable
函数,并设置一个等于该函数输出的临时数据。
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集合,但只有当bookedorders
是数据表时才会有效。
编辑#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
然后在if语句中看起来像:
Dim tempDT as new DataTable
tempDT.Merge(query.CopyToDataTable)
tempDT.Columns.Remove("GroupID")
tempDt.Name = "ProductID" & r
ds.Tables.Add(tempDT)
同样,这只有在您通过数据表进行LINQing并获得Enumerable(Of DataRow)
作为结果时才会起作用,这是优选的。
答案 1 :(得分:0)
我不熟悉VB.NET语法,它应该是这样的(我不保证100%代码实际编译):
Dim query = From r In bookedorders _
Group By key = r.Field(Of Integer)("productgroup") Into Group _
Select New With { _
.key, _
.Rows = From o In Group _
Select New With { _
.Name = r.Field(Of String)("productname") } }
如需进一步检查,您可以看到:
http://msdn.microsoft.com/en-us/vstudio/bb737908
,特别是 GroupBy - 嵌套示例,您可以在其中查看如何在组内投影。
如果你解决问题并在我的回答中发现一些编译错误,请告诉我什么,我会解决它。