2009-06-23 41 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()是有用的。