【问题标题】:DataTable Error - Can't CopyToDataTable()数据表错误 - 无法 CopyToDataTable()
【发布时间】: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

【问题讨论】:

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


    【解决方案1】:

    您需要将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

    【讨论】:

    • 谢谢!! - 使用Key 标识符解决了带回重复项的第一个问题,但我仍然无法让CopyToDataTable 工作...... :(
    • CopyToDataTable() 仅适用于 IEnumerable(of DataRow) 并且您拥有匿名类型的 IEnumerable。
    • 再次,@Magnus,谢谢!! - 这是有道理的......让我感到困惑的是 MSDN 文档,如下所示:msdn.microsoft.com/en-us/library/bb386921.aspx - 他们如何在第三个示例中做到这一点? - 我错过了什么吗???
    • ...我很抱歉-我又读了一遍,他们提供了为您完成工作的例程...@Magnus,非常感谢!!!!
    • @JohnBus​​tos 很高兴我能帮上忙。
    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多