У меня есть список AE_AlignedPartners
элементов в БД, который я извлекаю с помощью:
List<AE_AlignedPartners> ae_alignedPartners_olds = ctx.AE_AlignedPartners.AsNoTracking().ToList();
Затем я получил и сериализовал новый список (того же типа объекта) с помощью JSON:
List<AE_AlignedPartners> ae_alignedPartners_news = GetJSONPartnersList();
Чем я получаю пересечения обоих:
var IDSIntersections = (from itemNew in ae_alignedPartners_news
join itemOld in ae_alignedPartners_olds on itemNew.ObjectID equals itemOld.ObjectID
select itemNew).Select(p => p.ObjectID).ToList();
Теперь, из-за этих пересечений, мне нужно проверить, были ли изменены некоторые записи, проверить много полей ичем добавить в «мониторинг» список обновлений.Вот код:
IList<AE_AlignedPartners> ae_alignedPartners_toUpdate = new List<AE_AlignedPartners>();
foreach (var item in IDSIntersections)
{
var itemOld = ae_alignedPartners_olds.First(p => p.ObjectID == item);
var itemNew = ae_alignedPartners_news.First(p => p.ObjectID == item);
if (itemOld.Field1 != itemNew.Field1 ||
itemOld.Field2 != itemNew.Field2 ||
itemOld.Field3 != itemNew.Field3 ||
itemOld.Field4 != itemNew.Field4 ||
itemOld.Field5 != itemNew.Field5 ||
itemOld.Field6 != itemNew.Field6 ||
itemOld.Field7 != itemNew.Field7 ||
itemOld.Field8 != itemNew.Field8 ||
itemOld.Field9 != itemNew.Field9)
{
AE_AlignedPartners toUpdate = mapper.Map<AE_AlignedPartners, AE_AlignedPartners>(itemNew);
toUpdate.ID = itemOld.ID;
ae_alignedPartners_toUpdate.Add(toUpdate);
}
}
Который очень медленный (~ 4 минуты в выпуске с ~ 70k записями).
Недавно я обнаружил здесь IEqualityComparer
, который действительно ускоряет процесс сравнения.
Могу ли я воспользоваться этим в этом случае?Или что является действительной оптимизацией?
Я бы не использовал предложенный FullOuterJoin
, поскольку это будет означать много рефакторинга прямо сейчас (я сделаю это в следующем проекте, обещание).
Есть советы?Спасибо