1

假设我有以下 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 指出的那样,这是我在这个问题中给出的)和实现它在这里

4

1 回答 1

2

您需要将标识符添加到VB中匿名类型Key的属性中。(在 C# 中,所有属性都是关键属性)仅比较关键属性的值以确定两个实例是否相等,您需要这样做才能工作。Distinct()

Select New With {
                 Key .Col1 = dr1.Field(Of Double)("Col1"),
                 Key .Col2 = dr2.Field(Of String)("Col2")
                }

至于CopyToDataTable开始处理匿名类型,请查看此答案

于 2013-01-14T20:37:03.487 回答