Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 按列分组,然后将每个组添加到datatable,然后添加到数据集中_Vb.net_Linq_Datatable_Group By_Dataset - Fatal编程技术网

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 ║ 
        ╚═══════════════╩═══════════════╩
现在问题是

  • 如何使用LINQ(完成)按产品组列进行分组
  • 如何从结果组中删除产品组列
  • 如何将每个组添加到单独的数据表中,然后添加所有组 表到单个数据集?(完成)
  • 假设有我不想在结果中显示的列 小组,我怎么能把他们藏起来
  • 这是我到目前为止试过的

        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提取每种类型的所有产品,将它们添加到一个表中,然后将命名表添加到数据集中。您可以删除名称部分或将其更改为任何内容