DataTable错误 - 无法CopyToDataTable()

时间:2013-01-14 17:43:28

标签: .net vb.net linq ado.net

假设我有以下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

1 个答案:

答案 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