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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With