Compare two DataTables and select the rows that are not present in second table

Catalin picture Catalin · Mar 30, 2013 · Viewed 67.9k times · Source

I have two DataTables and I want to select the rows from the first one which are not present in second one

For example:

Table A
  id   column
  1     data1
  2     data2
  3     data3
  4     data4

Table B
  id   column
  1     data10
  3     data30

I want the result to be:

Table C
  id    column
  2      data2
  4      data4

Answer

Tim Schmelter picture Tim Schmelter · Mar 30, 2013

You can use Linq, especially Enumerable.Except helps to find id's in TableA that are not in TableB:

var idsNotInB = TableA.AsEnumerable().Select(r => r.Field<int>("id"))
        .Except(TableB.AsEnumerable().Select(r => r.Field<int>("id")));
DataTable TableC = (from row in TableA.AsEnumerable()
                   join id in idsNotInB 
                   on row.Field<int>("id") equals id
                   select row).CopyToDataTable();

You can also use Where but it'll be less efficient:

DataTable TableC = TableA.AsEnumerable()
    .Where(ra =>  !TableB.AsEnumerable()
                        .Any(rb => rb.Field<int>("id") == ra.Field<int>("id")))
    .CopyToDataTable();