按列分组然后将每个组添加到数据表,然后添加到数据集中

时间:2012-10-15 18:15:04

标签: vb.net linq datatable group-by dataset

这种事情的最佳方法是什么?

所以这是我的数据表

╔═══════════════╦═══════════════╦═══════════════╗
║ 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 ║ 
        ╚═══════════════╩═══════════════╩

现在问题是

  1. 如何使用LINQ(完成)
  2. 按产品组列进行分组
  3. 如何从结果组中删除“产品组”列?
  4. 如何将每个组添加到单独的数据表中,然后添加所有组 表到单个数据集?(完成)
  5. 假设有一些我不希望在结果中显示的列 小组,我怎么能隐藏它们?
  6. 这是我到目前为止所尝试的内容

        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
    

    现在这是有效的,但我不知道如何选择特定的列,比如我不想在结果数据表中显示所有列

2 个答案:

答案 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 - 嵌套示例,您可以在其中查看如何在组内投影。

如果你解决问题并在我的回答中发现一些编译错误,请告诉我什么,我会解决它。