检测LINQ插入在submitChanges之前和使用BulkInsert

时间:2010-11-01 18:44:54

标签: sql linq linq-to-sql bulkinsert

我有一堆代码,除了一些更新/删除之外,还设置为向LINQ DB添加10k到20k的插入。所有这些更改都是通过db.SubmitChanges()调用提交的。问题是太慢了:( 在StackOverflow的这篇精彩帖子中,性能已经过彻底测试:

Very slow insert process using Linq to Sql

问题是我不想重写准备我的数据库对象的所有代码。我试图伪造我想在下面做的事情。

免责声明:这不是真正的代码!它不会编译....甚至没有关闭:))

老路:

SchedDB.Data.SchedulerDBDataContext db = new SchedDB.Data.SchedulerDBDataContext();
//Do a bunch of stuff to populate "db"
db.SubmitChanges()

新方式:

SchedDB.Data.SchedulerDBDataContext db = new SchedDB.Data.SchedulerDBDataContext();
//Do a bunch of stuff to populate "db"
//NEW: Detect all of the inserts in the "db" object.  Remove those inserts and generate code to insert them with a batch dataadapter.  For example:
//
//DataTable dtProducts = new DataTable()
//dtProducts.Columns.Add(ProductID) //yada yada all of the columns here
//
//DataTable dtCustomers = new DataTable()
//dtCustomers.Columns.Add(CustomerID) //yada yada all of the columns here


//foreach (insertItem in db.Inserts) //this is pseudo code, I need help here
//{
//   if (insertItem.destinationTable == "Products")
//   {
//      DataRow dr = dtProducts.NewRow();
//      dr["ProductID"] = insertItem.ProductID; //This line of code probably isn't even close to being right... I can't imagine the "insertItem" holding all of the columns no matter what the destinationTable is
//   }
//   if (insertItem.destinationTable == "Customers")
//   {
//       //similar code, all customer columns, yada yada
//   }
//   IMPORTANT: remove the item from the LINQ db so it doesn't insert it anymore
//
// Make a table adapter for each datatable
// Set the .BatchSize parameter
//Commit each table adapter.
// db.SubmitChanges()  //If there are any updates or deletes they are still in here and still need to happen.

如果批量更新中有任何错误,那么很高兴知道所以我可以回滚LINQ数据库并可能运行一些其他代码来清除dataapapters插入。 (我可以处理这个,我的所有插入都有一个额外的列,这是一个对批量插入是唯一的int。)

2 个答案:

答案 0 :(得分:2)

好的,我找到了问题的答案。您可以从这里下载甜蜜课程:

http://code.msdn.microsoft.com/LinqEntityDataReader

这个类非常适合我,我可以将LINQ生成的“Customer”对象集合传递给SQLBulkCopy!

答案 1 :(得分:0)

为什么不插入db.SubmitChanges();而不是完成所有这些操作。在每个单独的项目之后,或在X项目的块之后调用?这也不是理想的,但比一次提交大量更改更好,并且可能很容易在代码中进行更改。

提供DataContext中等大小的更新,实际上并没有为您完成这些更新。然后继续进行更有成效的事情。