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

是否可以使用linq to sql插入大量数据?

  •  3
  • jlp  · 技术社区  · 16 年前

    我需要在SQLServer2008中插入大量数据。我的项目是基于linqtosql的。

    Order 对象。 订单 还包含 Category Code 物体。我需要将每一行映射到对象以验证它。

    然后我需要将所有这些对象插入数据库。

    List<Order> orders = Import("test.csv");
    db.Orders.InsertAllOnSubmit(orders);
    db.SubmitChanges();
    
    OR
    
    foreach(Order order in orders)
    db.Orders.InsertOnSubmit(order);
    db.SubmitChanges();
    

    两种方式都很慢。有解决办法吗?对于这个任务,我可以使用l2sql以外的其他方法。

    我读到了SqlBulkCopy类-它能处理吗 插入子实体

    4 回复  |  直到 16 年前
        1
  •  2
  •   Amy B    16 年前

    尝试使用较小的事务。

    foreach(List<Order> orderbatch in orders.Batch(100))
    {
      db.Orders.InsertOnSubmit(orderbatch); 
      db.SubmitChanges();   
    }
    
    
    public static IEnumerable<List<T>> Batch<T>(this IEnumerable<T> source, int batchAmount)
    {
      List<T> result = new List<T>();
      foreach(T t in source)
      {
        result.Add(t);
        if (result.Count == batchSize)
        {
          yield return result;
          result = new List<T>();
        }
      }
      if (result.Any())
      {
        yield return result;
      }
    }
    
        2
  •  2
  •   Mike Two    16 年前

    this blog 谈论如何让它工作。

    作者似乎是在我第一次读到这段代码后添加的(这是2008年的)。

        3
  •  0
  •   Brian Mains    16 年前

    这个CSV阅读器对我来说真的很快: http://www.codeproject.com/KB/database/CsvReader.aspx

    但是,如果您可以选择使用SQL Server,则只使用SQL Server的大容量复制操作会更快。

    嗯。

        4
  •  0
  •   STO    16 年前

    我认为最好是按组插入对象,例如1000个对象,然后释放会话。

    这里的性能在两个方面是平衡的:一边是内存中所有100000个对象导致的内存过度使用,另一边是创建会话和重新连接数据库的时间。