1

次の2つのデータテーブルがあるとします。

Table1:                               Table2:
Col1:                                 Col1:         Col2:
1                                     1             a
2                                     2             b
2                                     3             c
3                                     4             d
3                                     5             e
4                                     6             f
                                      7             g

そして、2つの間の結合に基づいて3番目のDataTableを作成し、個別の値を与える単純なLinqクエリが必要です-次のようになります。

Result:
Col1:       Col2:
1           a
2           b
3           c
4           d

私はこれがそれをするだろうと思いました:

Dim Result as DataTable = (From dr1 As DataRow In Table1.AsEnumerable
             Join dr2 As DataRow In Table2.AsEnumerable
             On dr1.Field(Of Double)("Col1") Equals dr2.Field(Of Double)("Col1")
             Select New With {
                                 .Col1 = dr1.Field(Of Double)("Col1"),
                                 .Col2 = dr2.Field(Of String)("Col2")
                             }).Distinct.CopyToDataTable

しかし、何をしようとしても、さまざまなエラーが発生します...

私の最初のエラーは、CopyToDataTableメソッドがのメンバーではないということですSystem.Generic.IEnumerable

それを削除して、次のように残します。

Dim Result = (From dr1 As DataRow In Table1.AsEnumerable
             Join dr2 As DataRow In Table2.AsEnumerable
             On dr1.Field(Of Double)("Col1") Equals dr2.Field(Of Double)("Col1")
             Select New With {
                                 .Col1 = dr1.Field(Of Double)("Col1"),
                                 .Col2 = dr2.Field(Of String)("Col2")
                             }).Distinct

実行されますが、結果を一意のリストにフィルタリングしません-col1からのすべての値をそこに残しますTable1

私はLinqを理解しようとしていますが、明らかに何かが欠けています-誰かがここで何が起こっているのか、そしてこれを修正する方法を私に説明できますか?


@Magnusのソリューションへの追加として、将来この種の問題に遭遇した人のCopyToDataTableために、匿名タイプのIEnumerableのメソッド(Magnusがこの質問で示したものであると指摘した)と実装をここで見つけることができます。ここにあります。

4

1 に答える 1

2

VBの匿名タイプKeyのプロパティに識別子を追加する必要があります。(C#では、すべてのプロパティがキープロパティです)2つのインスタンスが等しいかどうかを判断するために、キープロパティの値のみが比較されます。これが機能するには、これが必要です。Distinct()

Select New With {
                 Key .Col1 = dr1.Field(Of Double)("Col1"),
                 Key .Col2 = dr2.Field(Of String)("Col2")
                }

CopyToDataTable匿名タイプで作業することについては、この回答を確認してください。

于 2013-01-14T20:37:03.487 に答える