2011-11-22 6 views
7

Dire che ho:Come correttamente InsertAllOnSubmit() ed è meglio del ciclo 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(); 
} 

E 'possibile e/o migliore (? Peggio) di fare:

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(); 
} 

risposta

11

Ebbene si potrebbe usare 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(); 
} 

Sia che la volontà essere più efficiente o meno, non lo so.

+0

Grazie, ha funzionato. Sono stato respinto dall'intelligenza per aver detto che il tipo di input era IEnumerable. – BigOmega

2

Non dicendo che è meglio o peggio, ma ogni volta che puoi effettuare una singola chiamata al database o chiamare un database in un ciclo vedrai un aumento delle prestazioni. Ora, ciò che fa lo .SubmitChanges() dietro le quinte è qualcosa fuori dal nostro controllo.

3

Qui non vedrete alcun miglioramento delle prestazioni, perché non succede niente fino a quando non si chiama SubmitChanges().

Ma anche se si stesse facendo qualcosa di brutto come questo

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

Non mi aspetto alcun calo significativo delle prestazioni. Questo perché LINQ-to-SQL esegue inserti singolari.

Anche se si utilizza InsertAllOnSubmit, verrà ancora visualizzato un comando SQL separato per ogni riga inserita.

Problemi correlati