Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compare two DataTables for differences in C#? [duplicate]

Tags:

c#

linq

datatable

Possible Duplicate:
C#, how to compare two datatables A + B, how to show rows which are in B but not in A

I need to compare two datatables in c# to find the differences. The two datatables have the same schema. What is the best way to do it? Can it be done using linq queries? If yes, How?

like image 656
user1256789 Avatar asked Jun 11 '12 17:06

user1256789


1 Answers

You could use LINQ to join the two DataTable objects, matching every column. Then take the IQueryable and find all the rows in the first two DataTable objects which are not in the IQueryable.

Example:

private void SampleSolution(DataTable dt1, DataTable dt2)
{
    //If you have primary keys:
    var results = from table1 in dt1.AsEnumerable()
                    join table2 in dt2.AsEnumerable() on table1.Field<int>("id") equals table2.Field<int>("id")
                    where table1.Field<int>("ColumnA") != table2.Field<int>("ColumnA") || table1.Field<int>("ColumnB") != table2.Field<int>("ColumnB") || table1.Field<String>("ColumnC") != table2.Field<String>("ColumnC")
                    select table1;
    //This will give you the rows in dt1 which do not match the rows in dt2.  You will need to expand the where clause to include all your columns.


    //If you do not have primarry keys then you will need to match up each column and then find the missing.
    var matched = from table1 in dt1.AsEnumerable()
                    join table2 in dt2.AsEnumerable() on table1.Field<int>("ColumnA") equals table2.Field<int>("ColumnA")
                    where table1.Field<int>("ColumnB") == table2.Field<int>("ColumnB") || table1.Field<string>("ColumnC") == table2.Field<string>("ColumnC") || table1.Field<object>("ColumnD") == table2.Field<object>("ColumnD")
                    select table1;
    var missing = from table1 in dt1.AsEnumerable()
                    where !matched.Contains(table1)
                    select table1;
    //This should give you the rows which do not have a match.  You will need to expand the where clause to include all your columns.
}

The code above should work, though I did not test it.

You could also check out LINQ query on a DataTable which has some useful information on using LINQ with DataTables.
I also find the LINQ samples to be helpful when writting LINQ.

like image 54
Trisped Avatar answered Oct 02 '22 18:10

Trisped