【问题标题】:LINQ Compare two datatables with .except vbLINQ 用 .except vb 比较两个数据表
【发布时间】:2017-05-04 18:02:29
【问题描述】:

这是我的情况,我需要一些帮助。

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

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

每张表都有一个key 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 并且只返回 id 不在 dt1 中。

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 表中。

【问题讨论】:

  • 这和C#有什么关系?
  • 所以 dt1 有 3 列而 dt2 没有,对吗?如果是这样,您需要将它们添加到 query2 的结果集中,因为我认为 .Except 不适用于 2 个列不匹配的数据表。像这样:dt2.Columns.Add("MyColumn", GetType(string));
  • 除非他在Select 相同字段的两个查询上使用.Except
  • 正确,我在只有一列的两个查询上使用 .Except。

标签: vb.net linq datatable


【解决方案1】:

我相信你的问题是你试图在一个变量 notDt1 上调用 .ToDataTable,它是由你的查询产生的 IEnumerable(Of String) 类型。把.ToDataTable 去掉就行了。

【讨论】:

  • 感谢 NetMage,这有助于解决我遇到的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
相关资源
最近更新 更多