Porównaj dwa DataTables pod kątem różnic w C #? [duplikować]

Możliwy duplikat:
C #, jak porównać dwie opcje danych A + B, jak pokazać wiersze w B, ale nie w A

Muszę porównać dwie bazy danych w c #, aby znaleźć różnice. Dwie bazy danych mają ten sam schemat. Jak najlepiej to zrobić? Czy można to zrobić za pomocą zapytań linq? Jeśli tak, w jaki sposób?

 user125678911 cze 2012, 19:06
Mam na myśli DataTable w c #.
 Mark Byers11 cze 2012, 19:01
Jaka baza danych i wersja?
 Jeff Swensen11 cze 2012, 19:05
 YavgenyP11 cze 2012, 19:03
jeśli mówisz o serwerze sql i masz odpowiednią wersję studio wizualnego - po prostu skorzystaj z projektu bazy danych dostępnego
 jrummell11 cze 2012, 19:03
DataTables lub tabele bazy danych?

questionAnswers(1)

QuestionSolution

DataTable obiekty, pasujące do każdej kolumny. Więc weźIQueryable i znajdź wszystkie wiersze w pierwszych dwóchDataTable obiekty, których nie ma wIQueryable.

Przykład:

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.
}

Powyższy kod powinien działać, chociaż nie testowałem go.

Możesz także sprawdzićZapytanie LINQ na DataTable który ma kilka przydatnych informacji na temat używania LINQ z tabelami danych.
Znajduję takżePróbki LINQ pomocne przy pisaniu LINQ.

 user125678911 cze 2012, 19:21
Tak, będzie świetnie, jeśli możesz podać mi przykład, ponieważ jestem całkiem nowy w linq i c #
 user125678911 cze 2012, 19:42
dzięki tonie, wygląda dokładnie tak, jak szukałem. Pozwól mi spróbować :)
 Trisped11 cze 2012, 19:40
Proszę bardzo. Daj mi znać, jeśli masz jakieś problemy. Ponieważ instalacja zajęłaby trochę czasu, nie testowałem ich, ale powinny działać.

yourAnswerToTheQuestion