根据一列获得两个数据表之间的差异

时间:2013-07-16 07:36:02

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

我有以下情况:

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

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

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

2 个答案:

答案 0 :(得分:4)

使用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“left-join”-approach:

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();

答案 1 :(得分:0)

    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()