如何进行批量插入 - Linq to Entities

时间:2009-10-22 18:35:25

标签: c# asp.net-mvc entity-framework linq-to-entities

我找不到任何关于如何使用Linq to Entities进行批量/批量插入的示例。你们知道如何进行批量插入吗?

5 个答案:

答案 0 :(得分:22)

有时您只需要混合模型。也许对存储库的这一部分使用SqlBulkCopy(因为这会直接插入批量复制API),其余部分则使用Entity Framework。如有必要,可以直接使用ADO.NET。最终目标是完成工作。

答案 1 :(得分:12)

有关如何使用LINQ to Entities进行批量插入的完美示例,请参阅http://archive.msdn.microsoft.com/LinqEntityDataReader。它是一个允许轻松使用SqlBulkCopy的包装器。

@Marc Gravell是正确的,有时您必须混合模型才能完成工作。

答案 2 :(得分:6)

我写了一个类,它将批量插入EF实体(或任何类型的对象,只要属性名称与列名匹配)。

该类支持自定义批量大小,pre&插入事件,排队插入和“firehose模式”(给它十亿个对象,它将尊重批量大小)。

答案 3 :(得分:3)

您可以使用bulk insert extension

来完成此操作

它使用SqlBulkCopy和自定义datareader来获得最大性能。因此,它比使用常规插入或AddRange

快20多倍

使用efbulkinsert扩展的示例:

context.BulkInsert(hugeAmountOfEntities);

答案 4 :(得分:2)

为了在数据库中插入大量数据,我曾经将所有插入信息收集到列表中,并将此列表转换为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;
        }