2012-02-01 140 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(); 
    } 

這就是你需要的。

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