0

示例场景

我在数据库中有一个表,其中包含以下字段:- 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
  • SerialNo = 2 GroupNo = 1 描述 = 项目 B 数量 = 100
  • SerialNo = 3 GroupNo = 1 描述 = 项目 C 数量 = 100
  • 序列号 = 4 组号 = 2 描述 = 项目 D 数量 = 100
  • 序列号 = 5 组号 = 2 描述 = 项目 E 数量 = 100
  • SerialNo = 6 GroupNo = 3 描述 = 项目 F 数量 = 100

...实际上应该修改为返回...

  • 序列号 = 1 组号 = 1 描述 = 项目 A 数量 = 100
  • 序列号 = 4 组号 = 2 描述 = 项目 D 数量 = 100
  • SerialNo = 6 GroupNo = 3 描述 = 项目 F 数量 = 100

我正在使用带有 .NET 4.0 的 Visual Studio 2010 (VB.NET)。

我试图研究各种方法,但我要么卡住试图提取所有 4 列似乎没有正确分组。注意:我不想将查询修改为只返回数据子集。我需要用代码过滤/分组它。

4

1 回答 1

1

因此,您只想使用DataRow每个组中的第一个来初始化您的Item

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")
            }

如果您想将其复制到 aList(Of Item)中,您只需调用items.ToList().

于 2012-07-17T11:09:35.553 回答