假设我有以下两个数据表:
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
我想要一个简单的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解决方案的补充,对于将来遇到这种问题的任何人,匿名类型IEnumerable的CopyToDataTable
方法(正如Magnus指出的,我在这个问题中给出的)可以在这里找到,并在这里实现。
您需要在VB中的匿名类型属性中添加Key
标识符。(在c#中所有的属性都是键属性)只有键属性的值被比较,以确定两个实例是否相等,你需要这个Distinct()
工作。
Select New With {
Key .Col1 = dr1.Field(Of Double)("Col1"),
Key .Col2 = dr2.Field(Of String)("Col2")
}
关于让CopyToDataTable
在匿名类型上工作,请查看此答案