Я прочесали интернет, чтобы попытаться найти решение для этого, и, возможно, я не собираюсь этого делать правильно.Сравните два набора данных - найдите изменения - LINQ
Мне нужно сравнить два набора данных, идентичных по структуре, и хотели бы найти новые и измененные объекты (используя LINQ).
Используя то, что я нашел на CodeProject, мне удалось собрать список элементов, которые были изменены, но это было сделано путем жесткого кодирования каждого столбца (и их будет много) и проверки одинаковых значений:
var updRec = from u in updated
join o in orig
on u.KeyValue equals o.KeyValue
where
(o.Propery1 != u.Propery1) ||
(o.Propery2 != u.Propery2)
select new record
{
KeyValue = u.KeyValue,
Propery1 = u.Propery1,
Propery2 = u.Propery2 ,
RecordType = "mod" // Modified
};
Я мог бы использовать помощь 2 вещи:
- есть ли более эффективный способ перебора каждого из столбцов, как я планирую добавить много больше свойств, что мне нужно, чтобы сравнить ? Должен быть лучший способ динамически проверять 2 идентичных набора данных для изменений.
- Как я могу видеть , который недвижимости изменился? Например, создавая список «Свойство, оригиналValue, UpdateValue» для всех элементов, которые не идентичны?
Надеюсь, это объяснит это хорошо. Пожалуйста, не стесняйтесь указывать мне на другие способы обработки этого сценария, если я не смотрю на него правильно.
Вы можете переопределить 'Equals()' в вашем объекте 'record' и выполнить сравнение там. Затем вы можете изменить предложение 'where' на' where o.Equals (u) '. Но это просто переводит сравнение в более инкапсулированное место. Если вы хотите больше автоматизации, вам, вероятно, придется использовать отражение. –
Возможно, вам придется перечислить все столбцы, возможно, я просто не знаю лучшего способа, но я знаю, что в TSQL вам нужно перечислить все столбцы для сравнения дельт, хотя для более быстрого сравнения есть некоторые групповые трюки. –
Как вы определяете изменение? Я недавно наткнулся на аналогичную проблему, и я создал метод, который объединяет 2 объекта одного типа, принимая значение от объекта, свойство которого не равно null или по умолчанию, а также предоставляет возможность выбора приоритетного объекта, в случае оба свойства имеют значение. Если это то, что вам может понадобиться, сообщите мне, и я отправлю ответ с кодом и более подробным объяснением. –