如何正确InsertAllOnSubmit()并且比循环InsertOnSubmit()更好?

时间:2011-11-22 20:20:48

标签: c# linq-to-sql ienumerable

说我有:

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

3 个答案:

答案 0 :(得分:13)

你可以使用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();
}

这是否会更有效率,我不知道。

答案 1 :(得分: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命令,用于插入每个行。

答案 2 :(得分:2)

并不是说它更好或更糟,但是无论何时你可以进行单个数据库调用而不是在循环中调用数据库,你都会看到性能提升。现在幕后的.SubmitChanges()是我们无法控制的。