如何在linq中大量插入/更新到sql?

时间:2010-05-09 00:24:31

标签: c# .net linq-to-sql asp.net-mvc-2

我该如何做这两种情况。

目前我正在做这样的事情

public class Repository
{
     private LinqtoSqlContext dbcontext = new LinqtoSqlContext();

   public void Update()
   {
   // find record
   // update record
   // save record ( dbcontext.submitChanges()
   }

   public void Insert()
   {
      // make a database table object ( ie ProductTable t = new ProductTable() { productname 
           ="something"}
      // insert record ( dbcontext.ProductTable.insertOnSubmit())
     // dbcontext.submitChanges();
   }
}

所以现在我正在尝试加载一个包含大量记录的XML文件。首先,我一次验证一个记录。然后我想将它们插入到数据库中,而不是在每个记录之后执行submitChanges(),我想在最后进行批量提交。

所以我有类似的东西

public class Repository
{
    private LinqtoSqlContext dbcontext = new LinqtoSqlContext();
   public void Update()
   {
   // find record
   // update record
   }

   public void Insert()
   {
      // make a database table object ( ie ProductTable t = new ProductTable() { productname 
           ="something"}
      // insert record ( dbcontext.ProductTable.insertOnSubmit())
   }

   public void SaveToDb()
   {
      dbcontext.submitChanges();
   }
}

然后在我的服务层我会喜欢

for(int i = 0; i < 100; i++)
{
    validate();
    if(valid == true)
    {
       update();
       insert()
    }
}

SaveToDb();

因此假装我的for循环是对xml文件中找到的所有记录的计数。我首先验证它。如果有效,那么我必须在插入记录之前更新表。然后我插入记录。

之后我想一次性保存所有内容。

我不确定在更新时是否可以进行大规模保存,如果必须在每次或之后进行更新。

但我认为这对插入插件肯定有用。

似乎没有崩溃,我不知道如何检查记录是否被添加到dbcontext。

4 个答案:

答案 0 :(得分:2)

简单的答案是:你没有。 Linq2Sql是很多东西 - 它不是批量上传/批量复制的替代品。使用ETL路线将会提高效率:

  • 使用新数据生成平面文件(csv等)
  • 使用批量加载机制将其加载到数据库中
  • 如果数据正在更新等 - 将其加载到临时表中并使用MERGE命令将其合并到主表中。

Linq2Sql将在设计中总是吮吸大量插入方案。 ORM不是ETL工具。

答案 1 :(得分:0)

Linq2SQL(如前所述)默认情况下处理不好,但幸运的是有一些解决方案。 here's当我想要进行一些批量删除时,我用于网站。它对我很有用,并且由于它使用扩展方法,它基本上与常规的Lin2SQL方法无法区分。

答案 2 :(得分:0)

即使在调用SubmitChanges之前向DataContext添加多个记录,LINQ2SQL也会循环并逐个插入它们。您可以通过在实体类上实现一个部分方法(“InsertMyObject(MyObject instance)”)来验证这一点。它将分别为每个挂起的行调用。

我认为您的计划没有任何问题 - 您说它有效,但您只是不知道如何验证它?你不能简单地在数据库中查看是否添加了记录吗?

另一种查看DataContext中尚未添加的记录的方法是在数据上下文中调用GetChangeSet(),然后引用返回对象的“Inserts”属性以获取行列表将在调用SubmitChanges时插入。

答案 3 :(得分:0)

我还没有真正“发布”这个项目,但它是一个基于T4的存储库系统,它扩展了Linq To SQL并实现了一堆批处理操作(删除,更新,创建csv等):{{3 }}。您可以查看源代码并按照您认为合适的方式实现它。

此外,此链接还有一些用于批处理操作的优秀源代码:http://code.google.com/p/grim-repo/

而且,我也知道这很诱人,但不要废话老人。尝试使用DataAdapters / ADO.net执行批处理操作:http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx。它更快,但不可避免地更加毛茸茸。

最后,如果您有XML文件,则可以创建一个利用SQL Server的内置sproc sp_xml_preparedocument的存储过程。在这里查看如何使用它:http://davidhayden.com/blog/dave/archive/2006/01/05/2665.aspx