2010-01-09 23 views
5

Tengo dos tablas de datos (A, B) con la misma estructura. Necesito comparar cada fila de A con la de B y la Datatable C resultante debería tener la fila en A y los cambios de esa fila en B debajo de ella. Para las filas que son idénticas (los mismos valores en A & B), la tabla de datos resultante no debería tener estas filas.Comparación de tablas de datos y cambios de combinación

Por lo que la tabla de datos resultante debe tener cada fila en A y su fila no idéntica en B debajo de ella. La tabla resultante no debe tener filas idénticas.

¿Alguien puede ayudarme con el código C#.

+0

¿Necesita hacerlo en C# o es posible que utilice una herramienta? –

Respuesta

1

la forma más fácil es una unión entre bases de datos: se devuelven

create table merged 
(select * from db1.t) union (select * from db2.t) 

sólo filas únicas. para comparar registros, seleccione las filas que comparten la misma clave (la columna clave en fusionada no será única).

select * from merged order by key 

ordena los resultados en el orden que usted quería.

select * from merged where key in 
(select key from merged group by key having count(*) > 1) 
order by key 

devolverá solo las filas que no coincidan.

+0

Dado que ambas tablas de datos provienen de diferentes bases de datos, no puedo usar consultas Sql u Oracle para una unión entre bases de datos. ¿Hay alguna manera de lograr esto en C# .net ?? – vinodreddymk

+0

una forma es volcar los datos en csv e importarlos, sería el más rápido para dejar que sql haga las comparaciones – jspcal

+0

¿No podemos comparar directamente 2 tablas de datos y obtener el resultado deseado en lugar de volcar los datos en una csv? – vinodreddymk

1

Parece que desea calcular el symmetric difference de dos DataSets. Podemos hacer esto usando un poco de LINQ, un comparador de igualdad y algunos métodos de extensión. El código está probado y funcionando.

class Program 
{ 
    static void Main() 
    { 
     var a = new DataTable {Columns = {{"FirstName", typeof (string)}, {"Age", typeof (int)}}, Rows = {{"Alice", 31}, {"Bob", 42}}}; 
     var b = new DataTable {Columns = {{"FirstName", typeof (string)}, {"Age", typeof (int)}}, Rows = {{"Alice", 31}, {"Carol", 53}}}; 
     var diffs = a.SymmetricDifference(b); 
     Console.Write(diffs.Rows.Count); 
    } 
} 

public static class DataTableExtensions 
{ 
    public static DataTable SymmetricDifference(this DataTable a, DataTable b) 
    { 
     var diff = a.Clone(); 
     foreach (var person in a.AsPersonList().SymmetricDifference(b.AsPersonList())) 
     { 
      diff.Rows.Add(person.FirstName, person.Age); 
     } 

     return diff; 
    } 

    private static IEnumerable<Person> SymmetricDifference(this IEnumerable<Person> a, IEnumerable<Person> b) 
    { 
     return a.SymmetricDifference(b, new PersonComparer()); 
    } 

    private static IEnumerable<T> SymmetricDifference<T>(this IEnumerable<T> a, IEnumerable<T> b, IEqualityComparer<T> comparer) 
    { 
     return a.Except(b, comparer).Concat(b.Except(a, comparer)); 
    } 

    private static IEnumerable<Person> AsPersonList(this DataTable table) 
    { 
     return table.AsEnumerable().Select(row => row.AsPerson()).ToList(); 
    } 

    private static Person AsPerson(this DataRow row) 
    { 
     return new Person 
        { 
         FirstName = row.Field<string>("FirstName"), 
         Age = row.Field<int>("Age") 
        }; 
    } 
} 

public class PersonComparer : IEqualityComparer<Person> 
{ 
    public bool Equals(Person a, Person b) 
    { 
     return a.FirstName == b.FirstName && a.Age == b.Age; 
    } 

    public int GetHashCode(Person item) 
    { 
     return StringComparer.InvariantCultureIgnoreCase.GetHashCode(item.FirstName) 
       + StringComparer.InvariantCultureIgnoreCase.GetHashCode(item.Age); 
    } 
} 

public class Person 
{ 
    public string FirstName; 
    public int Age; 
} 
Cuestiones relacionadas