如何获得LINQ to SQL submitchanges的百分比?

我想知道是否有其他人问过类似的问题。

基本上,我有一个巨大的树,我正在使用LINQ对象在RAM中构建,然后我使用DataContext.SubmitChanges()一次性转储它。

它可以工作,但我找不到如何给用户一个目前为止查询进展程度的视觉指示。 如果我最终能够实现某种进度条,即使性能损失很小,这也会很棒。

请注意,我有相当多的行要放入数据库,超过750,000行。 我没有完全定时,但确实需要很长时间才能将它们放入。

编辑:我想我最好先说明我在做什么。

基本上,我正在用指环王建造一个后缀树。 因此,存在许多节点,并且某些节点具有与它们相关联的位置(恰好在后缀的末尾处的节点)。 我正沿着这些线构建Linq对象。

 suffixTreeDB.NodeObjs.InsertOnSubmit(new NodeObj() { NodeID = 0, ParentID = 0, Path = "$" }); 

在RAM中完全生成后缀树(只需几秒钟)后,我调用suffixTreeDB.submitChanges();

我想知道的是,如果有更快的方法这样做。 谢谢!

编辑2:我做了一个秒表,显然数据库写入需要6分钟。

我建议你划分你正在进行的调用,因为它们是在不同的单独调用中发送的。 这也将减少事务的大小(linq在调用submitchanges时会这样做)。

如果将它们分成10个75.000的块,则可以在1/10比例上提供粗略估计。

更新1:重新阅读你的post和你的新评论后,我认为你应该看一下SqlBulkCopy。 如果您需要改善操作时间,那就是要走的路。 检查这个相关的问题/答案: 在SQL Server中批量插入大量数据的最快方法是什么(C#client)

通过使用ctx.Log和ActionTextWriter,我能够获得ctx.submitchanges()的百分比进度

 ctx.Log = new ActionTextWriter(s => { if (s.StartsWith("INSERT INTO")) insertsCount++; ReportProgress(insertsCount); }); 

有关详情,请访问我的博客http://epandzo.wordpress.com/2011/01/02/linq-to-sql-ctx-submitchanges-progress/

和stackoverflow问题LINQ to SQL SubmitChangess()进度

这不是理想的,但您可以创建另一个线程,定期查询您正在填充的表,以计算已插入的记录数。 我不知道如果你在一个事务中运行,这将如何/如果这可行,因为可能有锁定/等。

我真正认为我需要的是一种Bulk-Insertforms,但看起来Linq不支持它。