代码之家  ›  专栏  ›  技术社区  ›  Luke101

如何对实体执行大容量插入-linq

  •  36
  • Luke101  · 技术社区  · 15 年前

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

    5 回复  |  直到 11 年前
        1
  •  22
  •   Marc Gravell    15 年前

    有时你只需要混合模型。也许用 SqlBulkCopy 对于存储库的这一部分(因为它直接插入到批量复制API中),对于其他部分则是实体框架。如有必要,还可以直接访问ado.net。最终目标是完成工作。

        2
  •  12
  •   Contango    14 年前

    有关如何使用linq to实体进行大容量插入的完美示例,请参见 http://archive.msdn.microsoft.com/LinqEntityDataReader . 它是一个包装器,允许轻松使用sqlbackcopy。

    @MarcGravell是对的,有时候你需要混合模型才能完成工作。

        3
  •  6
  •   Ronnie Overby    13 年前

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

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

        4
  •  3
  •   maxlego    11 年前

    你可以用 bulk insert extension

    它使用sqlbackcopy和自定义数据阅读器来获得最大的性能。因此,它比使用常规的insert或addrange快20倍以上

    使用EFBulkInsert扩展的示例:

    context.BulkInsert(hugeAmountOfEntities);
    
        5
  •  2
  •   Amit Bisht    11 年前

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