Подтвердить что ты не робот

Как сделать массовую вставку - Linq для объектов

Я не могу найти примеры того, как делать пакетную вставку с использованием Linq для Entities. Вы, ребята, знаете, как сделать массовую вставку?

4b9b3361

Ответ 1

Иногда вам просто нужно смешивать модели. Возможно, используйте SqlBulkCopy для этой части вашего репозитория (поскольку это подключается непосредственно к API-интерфейсу массового копирования) и Entity Framework для некоторых из отдых. И при необходимости, немного прямого ADO.NET. В конечном итоге цель состоит в том, чтобы выполнить работу.

Ответ 2

Для идеального примера того, как выполнять объемные вставки с LINQ to Entities, см. http://archive.msdn.microsoft.com/LinqEntityDataReader. Это оболочка, которая позволяет легко использовать SqlBulkCopy.

@Marc Gravell верен, иногда вам приходится смешивать модели, чтобы выполнить задание.

Ответ 3

Я написал класс, который будет содержать вставку объектов EF (или любой объект, если имена свойств совпадают с именами столбцов).

Класс поддерживает настройку размера партии, событий предварительной и последующей вставки, вставленных в очередь вставок и "режима пожарной тревоги" (при условии, что это миллиард объектов, он будет учитывать размер партии).

Ответ 4

Вы можете сделать это, используя расширение объемной вставки

Он использует SqlBulkCopy и пользовательский datareader для достижения максимальной производительности. В результате это более чем в 20 раз быстрее, чем использование обычной вставки или AddRange

Пример использования расширения efbulkinsert:

context.BulkInsert(hugeAmountOfEntities);

Ответ 5

Для ввода огромного количества данных в базу данных я собирал всю информацию о вставке в список и преобразовывал этот список в DataTable. Затем я вставляю этот список в базу данных через SqlBulkCopy.

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

InsertData(LiMyList, "MyTable");

Где InsertData есть

 public static void InsertData<T>(List<T> list,string TabelName)
        {
                DataTable dt = new DataTable("MyTable");
                clsBulkOperation blk = new clsBulkOperation();
                dt = ConvertToDataTable(list);
                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
                using (SqlBulkCopy bulkcopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString))
                {
                    bulkcopy.BulkCopyTimeout = 660;
                    bulkcopy.DestinationTableName = TabelName;
                    bulkcopy.WriteToServer(dt);
                }
        }    

public static DataTable ConvertToDataTable<T>(IList<T> data)
        {
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
            DataTable table = new DataTable();
            foreach (PropertyDescriptor prop in properties)
                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
            foreach (T item in data)
            {
                DataRow row = table.NewRow();
                foreach (PropertyDescriptor prop in properties)
                    row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                table.Rows.Add(row);
            }
            return table;
        }