假设我有以下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解决方案的补充,对于将来遇到此类问题的任何人来说,IEnumerable的匿名类型的CopyToDataTable
方法(正如Magnus指出的那样是我在这个问题中给出的) )可以找到here及其实施here。
答案 0 :(得分:2)
您需要将Key
标识符添加到VB中Anonymous Types的属性中。 (在C#中,所有属性都是关键属性)仅比较关键属性的值以确定两个实例是否相等,并且Distinct()
需要此实例才能工作。
Select New With {
Key .Col1 = dr1.Field(Of Double)("Col1"),
Key .Col2 = dr2.Field(Of String)("Col2")
}
至于让CopyToDataTable
处理匿名类型,请查看此answer。