我有一堆代码,除了一些更新/删除之外,还设置为向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。)
答案 0 :(得分:2)
好的,我找到了问题的答案。您可以从这里下载甜蜜课程:
http://code.msdn.microsoft.com/LinqEntityDataReader
这个类非常适合我,我可以将LINQ生成的“Customer”对象集合传递给SQLBulkCopy!
答案 1 :(得分:0)
为什么不插入db.SubmitChanges();而不是完成所有这些操作。在每个单独的项目之后,或在X项目的块之后调用?这也不是理想的,但比一次提交大量更改更好,并且可能很容易在代码中进行更改。
提供DataContext中等大小的更新,实际上并没有为您完成这些更新。然后继续进行更有成效的事情。