【问题标题】:Get difference between two data-tables according to one column根据一列获取两个数据表之间的差异
【发布时间】:2013-07-16 07:36:02
【问题描述】:

我有以下场景:

表 A 有 50 条记录,表 B 有 2 条记录。

我需要定义一个新表,比如 TableDiff,它应该包含表 A 中不存在于表 B 中的 48 条记录

我的问题是表 A 和表 B 不相同,但我在两个表中都有字段 rowId,我需要使用它进行比较。

【问题讨论】:

  • 什么意思?您需要一个表格和数据吗??
  • 是一个包含表 A 数据的表
  • 使用 LINQ 并加入 id 上的表,您可以将 LINQ 与 DataTables 一起使用,然后将其转换为 Enumerable
  • 您可以在使用 NOT IN 运算符创建新表时过滤掉表 B 中存在的值/id。

标签: c# asp.net linq system.data.datatable


【解决方案1】:

使用Enumerable.ExceptEnumerable.Join 的一种方式:

var aIDs = TableA.AsEnumerable().Select(r => r.Field<int>("RowID"));
var bIDs = TableB.AsEnumerable().Select(r => r.Field<int>("RowID"));
var diff = aIDs.Except(bIDs);
DataTable tblDiff = (from r in TableA.AsEnumerable()
                    join dId in diff on r.Field<int>("RowID") equals dId
                    select r).CopyToDataTable();

这是 linq-to-objects“左连接”方法:

DataTable tblDiff = (from rA in TableA.AsEnumerable()
                     join rB in TableB.AsEnumerable()
                     on rA.Field<int>("RowID") equals rB.Field<int>("RowID") into joinedRows
                     from ab in joinedRows.DefaultIfEmpty()
                     where ab == null
                     select rA).CopyToDataTable();

【讨论】:

    【解决方案2】:
        using System.Data.DataSetExtensions
    
        var tableAIds = tableA.AsEnumerable().Select(row => (int)row["rowId"]);
        var tableBIds = tableB.AsEnumerable().Select(row => (int)row["rowId"]);
        var resultantIds = tableAIds.Except(tableBIds);
    

    现在再次创建数据表

        DataTable diff =  from myRow in tableA.AsEnumerable()
                          join rIDS resultantIds in myRow.Field<int>("rowId") equals rIDS
                          select myRow).CopyToDataTable()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 2018-05-31
      相关资源
      最近更新 更多