VB.NET фильтрация/группировка таблицы данных

Пример сценария

У меня есть таблица в базе данных со следующими полями: - SerialNo, GroupNo, Description, Quantity. На данный момент я перебираю таблицу данных, которая была заполнена из набора данных ADO.NET, и я добавляю поля в список следующим образом...

' 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

Требование

Вместо получения каждой строки я хочу получить только первое вхождение каждого номера группы и вернуть этот результат в список. Например...

  • Серийный № = 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 столбца, похоже, они не группируются правильно. Примечание. Я не хочу изменять запрос, чтобы он возвращал только подмножество данных. Мне нужно отфильтровать/сгруппировать его с кодом.


person cw_dev    schedule 17.07.2012    source источник


Ответы (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")
            }

Если вы хотите скопировать его в List(Of Item), вам нужно только вызвать items.ToList().

person Tim Schmelter    schedule 17.07.2012