Вопрос по c#, datatable, linq – Сравните два DataTables для различий в C #? [Дубликат]

6

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

Мне нужно сравнить две таблицы данных в C #, чтобы найти различия. Две таблицы данных имеют одинаковую схему. Каков наилучший способ сделать это? Можно ли это сделать с помощью запросов linq? Если да, то как?

DataTableтаблицы или базы данных? jrummell
Я имею в виду DataTable в C #. user1256789
Какая база данных и версия? Mark Byers
Аналогичный:stackoverflow.com/questions/164144/… Jeff Swensen
Если вы говорите о сервере SQL и имеете соответствующую версию Visual Studio - просто используйте там доступный проект базы данных. YavgenyP

Ваш Ответ

1   ответ
7

DataTable объекты, соответствующие каждому столбцу. Затем возьмитеIQueryable и найти все строки в первых двухDataTable объекты, которых нет в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.
}

Код выше должен работать, хотя я не тестировал его.

Вы также можете проверитьLINQ-запрос к DataTable который имеет некоторую полезную информацию об использовании LINQ с DataTables.
Я также нахожуОбразцы LINQ быть полезным при написании LINQ.

спасибо огромное, это выглядит именно то, что я искал. Позвольте мне попробовать :) user1256789
Да, было бы здорово, если бы вы могли привести мне пример, так как я совсем новичок в linq и c # user1256789
Вот и ты. Дайте мне знать, если у вас есть какие-либо проблемы. Так как установка заняла бы некоторое время, я не проверял их, но они должны работать.

Похожие вопросы