2009-06-23 39 views

回答

3

尝试使用InsertOnSubmit而不是InsertAllOnSubmit。然后在适当的时间间隔,如Erich所说。

或者,如果你想分批进行,例如, 5,请尝试使用Handcraftsman'sdtb's获取IEnumerable的IEnumerable的解决方案。例如,与DTB的组块:

var actual = Get(); 
    using (var db = new DataClassesDataContext()) 
    { 
     foreach(var batch in actual.Chunk(5)) 
     { 
     db.Shapes.InsertAllOnSubmit(batch); 
     db.SubmitChanges(); 
     } 
    } 
3

一个选项是将其分成多个批次。创建一个Shape对象的临时缓冲区,迭代直到您填充它或从枚举器中耗尽,然后执行InsertBatchOnSubmit

+0

我如何获得5个组中的所有元素? – 2009-06-23 19:03:46

+0

我了解到InsertBatchOnSubmit将是一个InsertAllOnSubmit,其元素较少 – 2009-06-23 19:08:39

+1

Earwicker的链接有一个很好的例子。不过,我不确定这会对你有帮助,因为你正在执行延期执行。您可能必须在循环外有一个List 和batchSize = 5。从你的枚举器添加项目,一旦计数达到batchSize,插入,然后清除以前的批处理。那是你问的吗? – 2009-06-23 19:17:54

2

使用下面的扩展方法打破投入适当大小的子集

public static class IEnumerableExtensions 
{ 
    public static IEnumerable<List<T>> InSetsOf<T>(this IEnumerable<T> source, int max) 
    { 
     List<T> toReturn = new List<T>(); 
     foreach(var item in source) 
     { 
      toReturn.Add(item); 
      if (toReturn.Count == max) 
      { 
       yield return toReturn; 
       toReturn = new List<T>(); 
      } 
     } 
     if (toReturn.Any()) 
     { 
      yield return toReturn; 
     } 
    } 
} 

然后坚持的亚

void Insert() 
{ 
    var actual = Get(); 
    using (var db = new DataClassesDataContext()) 
    { 
     foreach (var set in actual.InSetsOf(5)) 
     { 
      db.Shapes.InsertAllOnSubmit(set); 
      db.SubmitChanges(); 
     } 
    } 
} 

你也可以找到关于InsertOnSubmit this MSDN article()VS InsertAllOnSubmit()是有用的。