0

サンプルシナリオ

次のフィールドを持つデータベースにテーブルがあります:- SerialNo、GroupNo、Description、Quantity。現時点では、ADO.NET DataSet から取り込まれた DataTable を循環させており、次のようにフィールドを List に追加しています...

' 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 の最初の出現のみを取得し、この結果を List に返します。例えば...

  • SerialNo = 1 GroupNo = 1 Description = アイテム A 数量 = 100
  • SerialNo = 2 GroupNo = 1 Description = アイテム B 数量 = 100
  • SerialNo = 3 GroupNo = 1 Description = アイテム C 数量 = 100
  • SerialNo = 4 GroupNo = 2 Description = アイテム D 数量 = 100
  • SerialNo = 5 GroupNo = 2 Description = アイテム E 数量 = 100
  • SerialNo = 6 GroupNo = 3 Description = アイテム F 数量 = 100

...実際には、返すように変更する必要があります...

  • SerialNo = 1 GroupNo = 1 Description = アイテム A 数量 = 100
  • SerialNo = 4 GroupNo = 2 Description = アイテム D 数量 = 100
  • SerialNo = 6 GroupNo = 3 Description = アイテム 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")
            }

にコピーしたい場合List(Of Item)は、 を呼び出すだけitems.ToList()です。

于 2012-07-17T11:09:35.553 に答える