Алгоритм Entity Framework для объединения данных

Это относится к проекту, который я унаследовал, и не может изменить структуру таблицы или модель доступа к данным. Меня попросили оптимизировать алгоритм, используемый для вставки данных в базу данных.

У нас есть набор данных в таблице T. Из этого мы извлекаем набор, который мы назовем A. Мы также запрашиваем XML-канал и получаем набор мы вызовем X.

  • Если значение из X находится в A, запись в A должна быть обновлена, чтобы отразить данные для X.record
  • Если значение из X не находится в A, X. запись должна быть вставлена ​​в A
  • Если значение из A не находится в X, A. запись должна быть сохранена в A
  • X должна быть полностью повторена для всех записей, и A должен быть обновлен

Все эти изменения необходимо вставить обратно в базу данных.

Установленный алгоритм делает следующее:

Query XML into a LIST
foreach over the XML LIST
    look up foreach.item in A via LINQ (i.e. query = from record in A where
                                                         record.GUID == foreach.item.GUID
                                                         select record)
    if query.Count() == 0
        insert into A (via context.AddToTableName(newTableNameObject)
    else
        var currentRecord = query.First()
        set all properties on currentRecord = properties from foreach.item
        context.SaveChanges()

Я знаю, что это неоптимально. Я попытался поместить A в объект (назовите его queryA) вне цикла foreach, пытаясь переместить запрос в память, не касаясь диска, но, подумав над этим, я понял, что база данных уже находится в памяти.

После добавления объектов таймера в алгоритм становится ясно, что больше всего времени уходит на вызов функции SaveChanges (). В некоторых случаях это 20 мс, а в некоторых других, очевидно, оно перескакивает до 100 мс.

Я бы предпочел вызывать SaveChanges () только один раз. Я могу' Я выяснил, как это сделать, учитывая мои глубокие знания EF (которые в лучшем случае тонкие) и ограничения, связанные с невозможностью изменять структуры таблиц и необходимостью сохранять данные из A, которых нет в X.

Предложения ?

6
задан Ladislav Mrnka 27 April 2011 в 07:46
поделиться