Linq VB.NET筛选/分组数据表

Linq VB.NET筛选/分组数据表,linq,datatable,vb.net-2010,Linq,Datatable,Vb.net 2010,示例场景 我在数据库中有一个包含以下字段的表:-SerialNo、GroupNo、Description、Quantity。目前,我正在围绕一个从ADO.NET数据集填充的DataTable循环,并将字段添加到一个列表中,如下所示 ' Gets the items from the database and created a DataSet ' The DataSet has a named DataTable called MyTable ds = GetItems ' Item is

示例场景

我在数据库中有一个包含以下字段的表:-SerialNo、GroupNo、Description、Quantity。目前,我正在围绕一个从ADO.NET数据集填充的DataTable循环,并将字段添加到一个列表中,如下所示

' Gets the items from the database and created a DataSet
' The DataSet has a named DataTable called MyTable
ds = GetItems 

' Item is an model in my MVC project
Dim Item As Item

' I am creating a List of items...
i As List(Of Item)

For Each row As DataRow In ds.Tables("MyTable").Rows
    Item = New Item() With {
        .SerialNo = If(Not IsDBNull(row("SerialNo")), CInt(row("SerialNo")), 0),
        .GroupNo = If(Not IsDBNull(row("GroupNo")), CStr(row("GroupNo")), ""),
        .Description = If(Not IsDBNull(row("Description")), CStr(row("Description")), ""),
        .Quantity = If(Not IsDBNull(row("Quantity")), CInt(row("Quantity")), 0)
    }

    ai.Add(Item)
Next
要求

我不想获取每一行,而是只获取每个GroupNo的第一次出现,并将此结果返回到列表中。例如

  • 序号=1组序号=1说明=项目A数量=100
  • 序号=2组序号=1说明=B项数量=100
  • 序号=3组序号=1说明=C项数量=100
  • 序号=4组序号=2说明=D项数量=100
  • 序号=5组序号=2说明=E项数量=100
  • 序号=6组序号=3说明=F项数量=100
。。。实际上应该修改为返回

  • 序号=1组序号=1说明=项目A数量=100
  • 序号=4组序号=2说明=D项数量=100
  • 序号=6组序号=3说明=F项数量=100
我正在使用Visual Studio 2010(VB.NET)和.NET 4.0


我曾尝试过各种方法,但我要么在尝试提取所有4列时陷入困境,要么似乎分组不正确。注意:我不想修改查询以只返回数据的子集。我需要使用代码对其进行筛选/分组。

因此,您只需获取每个组的第一个
数据行来初始化

Dim items = From row In ds.Tables("MyTable").AsEnumerable()
            Let GroupNo = row.Field(Of Int32)("GroupNo")
            Group row By GroupNo Into Group
            Select New Item() With {
                .GroupNo = GroupNo,
                .SerialNo = Group.First().Field(Of Int32)("SerialNo"),
                .Quantity = Group.First().Field(Of Int32)("Quantity"),
                .Description = Group.First().Field(Of String)("Description")
            }
如果要将其复制到(项目)列表中
,只需调用
items.ToList()