【发布时间】:2013-01-14 17:43:28
【问题描述】:
假设我有以下 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
它会运行,但它不会将结果过滤到唯一的列表中 - 它会将 Table1 中的所有 col1 值保留在其中。
我正在尝试理解 Linq,但显然遗漏了一些东西 - 有人可以向我解释一下这里发生了什么以及如何解决这个问题吗??
作为@Magnus 解决方案的补充,对于将来遇到此类问题的任何人,匿名类型的 IEnumerable 的 CopyToDataTable 方法(正如 Magnus 指出的,我在这个问题中给出的)可以可以找到here 和它的实现here。
【问题讨论】: