2011-11-22 22 views
7

說我有:如何正確InsertAllOnSubmit()並且比循環InsertOnSubmit()更好?

using (SomeDataContext db = new SomeDataContext()) 
{ 

    foreach(Item i in Items) 
    { 
      DbItem d = new DbItem; 
      d.value = i.value; 
      //.... etc ... 

      db.InsertOnSubmit(d); 
    } 

    db.SubmitChanges(); 
} 

是否有可能和/或更好的(?更糟)做:

using (SomeDataContext db = new SomeDataContext()) 
{ 
    IEnumerable<DbItem> dbItems = //???? possible? 

    foreach(Item i in Items) 
    { 
      DbItem d = new DbItem; 
      d.value = i.value; 
      //.... etc ... 

      dbItems.Add(d); // ???? again, somehow possible? 
    } 

    db.InsertAllOnSubmit(dbItems); 
    db.SubmitChanges(); 
} 

回答

11

那麼你可以使用List<T>

using (SomeDataContext db = new SomeDataContext()) 
{ 
    List<DbItem> dbItems = new List<DbItem>(); 

    foreach(Item i in Items) 
    { 
      DbItem d = new DbItem; 
      d.value = i.value; 
      //.... etc ... 

      dbItems.Add(d); 
    } 

    db.InsertAllOnSubmit(dbItems); 
    db.SubmitChanges(); 
} 

至於這是否會無論效率與否,我都不知道。

+0

謝謝,這工作。 intellisense說我的輸入類型是IEnumerable。 – BigOmega

2

並不是說它好壞,但任何時候您可以進行單個數據庫調用與在循環中調用數據庫,您都會看到性能提高。現在.SubmitChanges()在幕後做了什麼是我們無法控制的東西。

3

這裏你不會看到任何性能改進,因爲在你撥打SubmitChanges()之前什麼也沒有發生。

但是,即使你正在做一些醜陋這樣

foreach(Item i in Items)  
{   
    DbItem d = new DbItem;   
    d.value = i.value;   
    //.... etc ...    
    db.InsertOnSubmit(d);  
    db.SubmitChanges(); 
}  

我不希望任何顯著的性能下降。這是因爲LINQ-to-SQL確實使用了單數插入。

即使您使用InsertAllOnSubmit,仍然會看到一個單獨的SQL命令,用於每個行被插入。