Comparar dos DataTables según sus DataRows

Hola que tal.

En ocasiones es necesario comparar el contenido de dos DataTable para determinar qué registros (DataRow) están en una y en otra no.

Supongamos tenemos dos DataTable; dt1 y dt2, ambas con el mismo esquema. La tabla dt2 contiene más registros que la taba dt1, por lo que deseamos saber qué registros de dt2 no están incluidos en dt1 comparando por uno de los campos de los registros, en nuestro ejemplo el campo IdCliente. Para determinar esto utilizaremos la siguiente consulta:

DataTable dtRes = new DataTable();

dtRes = dt2.AsEnumerable()

    .Where(r =>

        !dt1.AsEnumerable().Any(w =>

            w.Field<int>("IdCliente") == r.Field<int>("IdCliente")))

        .CopyToDataTable<DataRow>();

 

Considerar que esta consulta devolverá los campos de dt2 que no están en dt1, si  se quiere el efecto contrario, modificaremos la expresión lambda quitando la negación de la consulta, quedando como sigue:

DataTable dtRes = new DataTable();

dtRes = dt2.AsEnumerable()

    .Where(r =>

        dt1.AsEnumerable().Any(w =>

            w.Field<int>("IdCliente") == r.Field<int>("IdCliente")))

        .CopyToDataTable<DataRow>();

 

Consideremos que la segunda consulta traerá todos los registros de dt2 que están en dt1, por lo que puede ser que la consulta devuelva todos los registros de dt1 o menos.

Si ninguna de las tablas tienen coincidencias entonces, devolverá 0 campos. Ambas tablas deben tener la misma estructura para que funcione.

Espero te sea de utilidad.

Saludos…

Octavio Telis

 

 

Published Tue, Aug 23 2011 21:49 by Octavio Telis Aynés
Filed under: ,

Comments

# re: Comparar dos DataTables según sus DataRows

Wednesday, January 23, 2013 2:49 PM by Yelinna

Hermosa manera de usar linq, y muy práctica! Esta entrada ha ido directa a mis favoritos :D

# re: Comparar dos DataTables según sus DataRows

Sunday, January 05, 2014 9:47 PM by Alexis

Exelente aporte tenia un error en Any pero ya lo he solucionado. Me ha sido de gran utilidad Gracias

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above:  
Powered by Community Server (Commercial Edition), by Telligent Systems