1

そのようなことへの最善のアプローチは何でしょうか?

これが私のデータテーブルです

╔═══════════════╦═══════════════╦═══════════════╗
║ 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を使用して、このデータテーブルを製品グループ列でグループ化し、次のグループを生成します

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 ║ 
        ╚═══════════════╩═══════════════╩

今の質問は

  1. LINQ(完了)を使用して製品グループ列でグループ化するにはどうすればよいですか?
  2. 結果のグループから製品グループ列を削除するにはどうすればよいですか?
  3. 各グループを個別のデータテーブルに追加してから、すべてのテーブルを単一のデータセットに追加するにはどうすればよいですか?(完了)
  4. 結果のグループに表示したくない列があったとしたら、どうすればそれらを非表示にできますか?

これが私がこれまでに試したことです

    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

結果のデータテーブルにすべての列を表示したくないなど、特定の列を選択する方法がわからない場合を除いて、これは機能しています。

4

2 に答える 2

1

1.LINQ を使用して製品グループ列でグループ化する方法

あなたが求めているのは、技術的にLINQのグループと呼ばれていないようです。linq でのグループ化は、1 つの列から値を取得し、それらを何らかの方法 (SUM、平均) で組み合わせて、一意の識別子ごとに 1 つのレコードを表示することを意味します。あなたの例では、グループごとの平均価格を表示したい場合、それにはグループが必要になりますが、あなたの説明から、次のような3つの異なる選択ステートメントが必要なように見えます:

From r in products where r.groupID = YourControlVariable select r.ProductName, r.ProductPrice

YourControlVariable は各グループ ID になります。この LINQ は、概説した 3 つのテーブルを提供し、そこからCopyToDataTableLINQ が返したものに対して関数を呼び出し、その関数の出力に等しい一時データテーブルを設定できます。

2.結果グループから製品グループ列を削除するにはどうすればよいですか?

ポイント1のlinqを参照してください。選択したい列のみをリストすることで、リストされていない列は基本的に無視されます。

3.各グループを個別のデータテーブルに追加してから、すべてのテーブルを単一のデータセットに追加するにはどうすればよいですか?

使用するグループ ID がわかっている場合、ループでこれを実行するのは非常に簡単です。ループ内に一時データテーブルを作成し、ポイント 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 コレクションを使用するように例を少し変更しましたが、それはデータテーブルの場合にのみ機能bookedordersします。

編集#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

そして、あなたのif文の中は次のようになります:

Dim tempDT as new DataTable
tempDT.Merge(query.CopyToDataTable)
tempDT.Columns.Remove("GroupID")
tempDt.Name = "ProductID" & r
ds.Tables.Add(tempDT)

繰り返しますが、これは、データテーブルを介して LINQ を実行しEnumerable(Of DataRow)、結果として を取得する場合にのみ機能します。これは望ましいことです。

于 2012-10-15T18:27:08.493 に答える
0

私は VB.NET 構文に慣れていません。次のようなものにする必要があります (コードが実際にコンパイルされることを 100% 保証するものではありません)。

Dim query = From r In bookedorders _
            Group By key = r.Field(Of Integer)("productgroup") Into Group _
            Select New With { _
              .key, _
              .Rows = From o In Group _
                      Select New With { _
                          .Name = r.Field(Of String)("productname") } }

さらにチェックするには、これを確認できます。

http://msdn.microsoft.com/en-us/vstudio/bb737908

特にGroupBy - Nestedサンプルでは、​​グループ内でどのように投影できるかを確認できます。

あなたがそれを解決し、私の答えでいくつかのコンパイルエラーを見つけたら、私に知らせてください。私はそれを修正します。

于 2012-10-15T20:26:56.720 に答える