LINQ使用.except vb比较两个数据表

时间:2017-05-04 18:02:29

标签: vb.net linq datatable

这是我的情况,我可以使用一些帮助。

我有三个数据表。 1和2来自查询数据库,第三个是一个将保存最终格式化表的表。

dt1有8列, dt2有5列, 和最终格式化的dtJoined。 我已经将所有行从dt1添加到dtJoined。

每个表都有一个密钥ID字段,我需要从dt2中找到不在dt1中的行,并将它们添加到格式化的dtJoined中。

这是我到目前为止所做的:

Dim query1 = (From a In dt1.AsEnumerable()
              Where Not a.IsNull("CustZ")
              Select a.Field(Of String)("id").Trim)
Dim query2 = (From a In dt2.AsEnumerable()
             Select a.Field(Of String)("id").Trim)

这很好(因为没有错误),我拉出每个表的关键字段,以便我可以比较数据行

接下来我想比较query2和query1,只返回不在dt1中的id。

Dim notDt1 = query2.Except(query1).ToDataTable 

这是我收到错误的地方。 错误是:

  

未处理的类型异常   发生'System.Reflection.TargetParameterCountException'   mscorlib.dll中

     

附加信息:参数计数不匹配。

我搜索过这个错误,并没有遇到任何我可以应用于我的情况。我迷路了,因为每个行集只有一列。

如果我可以通过此错误,我的下一步是将dt2加入到dt1中没有的键上,这样我就可以获得在比较表时删除的列。

Dim queryGetAllColumns = (From a In dt2.AsEnumerable()
                          Join b In notDt1.AsEnumerable()
                          On a("id") Equals b("id")
                          Select a).CopyToDataTable()  

然后遍历queryGetAllColumns并将行添加到格式化的dtJoined表中。

1 个答案:

答案 0 :(得分:0)

我认为您的问题是,您是要尝试.ToDataTable来自notDt1的变量IEnumerable(Of String),该变量来自您的查询。只需不用.ToDataTable即可。