вставка нескольких записей через набор объектов - PullRequest
1 голос
/ 11 сентября 2011

Есть ли способ вставить несколько записей без цикла, если у вас уже есть коллекция? Конечно, если вы делаете коммит вне цикла, выигрыш в производительности невелик.

У меня есть контекст и ObjectSet<Type>. У меня также есть коллекция Type, которую я хочу обменять или объединить или пересечь, или что у вас есть для того, что находится в таблице. Другими словами, я не хочу исходить из нижеприведенного:

foreach (Type r in Collection)
{
    Context.ObjectSet.Add(r);
}
Context.SaveChanges();

Ответы [ 3 ]

2 голосов
/ 11 сентября 2011

Вы всегда должны использовать цикл. В таких методах, как AddCollection или AddRange, не может быть никакого выигрыша в производительности, потому что эти методы обычно работают при некоторой оптимизации производительности, когда внутренняя коллекция расширяется для всего диапазона, и она просто копируется вместо расширения коллекции для каждого вызова Add. AddObject делает гораздо больше, чем просто передает данные в какую-то внутреннюю коллекцию, поэтому ей все равно приходится обрабатывать объекты по одному.

Если вы хотите оптимизировать производительность самих вставок базы данных, вы должны перейти к другому решению, потому что EF не имеет пакетных или массовых изменений данных. Каждая запись передается как отдельная вставка в отдельном цикле туда и обратно в базу данных.

1 голос
/ 11 сентября 2011

Вы можете попробовать создать метод расширения для создания цикла и добавления.см. ниже.

public static class AddHelper 
{


   public void AddAll(this ObjectSet<T> objectSet,IEnumerable<T> items)
   {

        foreach(var item in items)
        {
           objectSet.AddObject(item);

        }

   }

}

Тогда вы можете использовать код ниже.

 IEnumerable<EntityName> list = GetEntities(); //this would typically return your list
 Context.ObjectSet.AddAll(list);
0 голосов
/ 20 сентября 2013

Я ищу решение такого же типа.

Мне еще предстоит найти способ сделать это напрямую с EF, но есть способ сделать это. Если вы создаете хранимую процедуру, которая принимает DataTable в качестве параметра, вы можете выполнить PROC с Entity Context и передать таблицу в качестве параметра.

Когда вы имеете дело с тысячами или миллионами записей, это намного лучше, чем циклически проходить по каждой записи, передаваемой в БД.

Передача значений таблицы в хранимые процедуры SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...