假设我有以下 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
我想要一个简单的 Linq 查询,它根据两者之间的连接创建第三个 DataTable 并给出不同的值 - 如下所示:
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 指出的那样,这是我在这个问题中给出的)和实现它在这里。