2012-02-01 143 views
3

我有一个用linq-to-sql插入到数据库中的对象列表。 目前,我使用foreach循环,增加了每个元素,看起来大致是这样的:用linq-to-sql插入对象列表

foreach (o in List<MyObjectModel) 
{ 
    using MyDataContext 
    { 
    TheLinqToSqlTableModel TheTable = new TheLinqToSqlTableModel(); 

    TheTable.Fieldname = o.Fieldname; 
    .... repeat for each field 

    MyDataContext.TheTablename.InsertOnSubmit(TheTable); 
    MyDataContext.SubmitChanges(); 

    } 
} 

有没有更好的方式使用LINQ到SQL插入一个数据库对象的列表?

感谢您的建议。

回答

2

需要考虑的一些快速改进..

a)为什么要为每次迭代创建datacontext?

Using(Datacontext dc = new Datacontext()) 
{ 
    foreach(...) 
    { 

    } 
    dc.SubmitChanges(); 
} 

b)为插入创建存储过程并使用它将对性能有好处。

c)如果遇到任何错误,使用事务范围来撤消插入。

Using (TransactionScope ts = new TransactionScope()) 
    { 
     dc.SubmitChanges(); 
    } 
+0

+1在这里重用上下文是个好主意。使用存储过程是更好的方法。 LINQ不会批量执行'INSERT' /'UPDATE',因为它实际上并不打算。 – Yuck 2012-02-01 14:09:13

+0

明白了:linq-to-sql中没有批量操作;感谢您重复使用DC的提示。 – frenchie 2012-02-01 14:22:56

+0

linq-to-sql将为SubmitChanges的每次调用添加一个事务,只要您只在事务范围无用时调用它即可。在foreach中使用插入sp也不会将其更改为bulkinsert。在这种情况下,你需要移动到SqlBulkCopy – Pleun 2012-02-01 14:32:20

0
List<Object> Obj = (Enter the List you want to pass) 

foreach (var item in Obj) 
{ 
    item.Get your desired value after the dot 
} 
3

你为什么不使用InsertAllOnSubmit()方法。

例子:

IEnumerable<Post> _post = getAllNewPost(); 

Using(Datacontext dc = new Datacontext()) 
    { 
     dc.Posts.InsertAllOnSubmit(_post); 
     dc.SubmitChanges(); 
    } 

这就是你需要的。

////////////////////////