次の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がこの質問で示したものであると指摘した)と実装をここで見つけることができます。ここにあります。