2012-04-25 95 views
70

表:如何使用linq to sql一次更新多行?

id  userid friendid name status 
1  1  2   venkat false 
2  1  3   sai  true 
3  1  4   arun false 
4  1  5   arjun false 

如果用戶發送用戶ID = 1,friendids = 2,4,5狀態=真

請告訴我要如何更新所有friendids狀態爲真上面的查詢。 [每次2,3,4次]。

感謝

回答

185

要更新一列這裏有一些語法選項:

選項1

var ls=new int[]{2,3,4}; 
using (var db=new SomeDatabaseContext()) 
{ 
    var some= db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList(); 
    some.ForEach(a=>a.status=true); 
    db.SubmitChanges(); 
} 

選項2

using (var db=new SomeDatabaseContext()) 
{ 
    db.SomeTable 
     .Where(x=>ls.Contains(x.friendid)) 
     .ToList() 
     .ForEach(a=>a.status=true); 

    db.SubmitChanges(); 
} 

選項3

using (var db=new SomeDatabaseContext()) 
{ 
    foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList()) 
    { 
     some.status=true; 
    } 
    db.SubmitChanges(); 
} 

更新

正如評論請它可能是有意義的,以顯示如何更新多個列。所以我們假設爲了這個練習的目的,我們不僅要更新status。我們要更新namestatus,其中friendid與之匹配。這裏有一些語法選項爲:

選項1

var ls=new int[]{2,3,4}; 
var name="Foo"; 
using (var db=new SomeDatabaseContext()) 
{ 
    var some= db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList(); 
    some.ForEach(a=> 
        { 
         a.status=true; 
         a.name=name; 
        } 
       ); 
    db.SubmitChanges(); 
} 

選項2

using (var db=new SomeDatabaseContext()) 
{ 
    db.SomeTable 
     .Where(x=>ls.Contains(x.friendid)) 
     .ToList() 
     .ForEach(a=> 
        { 
         a.status=true; 
         a.name=name; 
        } 
       ); 
    db.SubmitChanges(); 
} 

選項3

using (var db=new SomeDatabaseContext()) 
{ 
    foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList()) 
    { 
     some.status=true; 
     some.name=name; 
    } 
    db.SubmitChanges(); 
} 

更新2

在我使用LINQ to SQL和在這種情況下,以提交給數據庫的使用,答案是:

db.SubmitChanges(); 

但對於實體框架提交修改是:

db.SaveChanges() 
+6

以及對多種意見,你需要做的:'records.ForEach(X => {x.Deleted = TRUE; x.DeletedByUserID = deletedByUserId; x.DeletedOn = DateTime.Now; });' – JonH 2014-09-12 11:35:21

+0

@ Jonh與OP有關的問題有什麼關係? – Arion 2014-09-12 18:13:42

+0

Arion簡單的答案...有人谷歌如何做到這一點,這個答案是谷歌頂部。答案是正確的,但是Google使用者想要爲多個列執行此操作,而不僅僅是一個。我的評論填補了缺失的一塊,沒有更多的只是一個... ... – JonH 2014-09-12 21:34:05

1

這是我做過什麼:

EF:

using (var context = new SomeDBContext()) 
{ 


foreach (var item in model.ShopItems) // ShopItems is a posted list with values 
{ 

var feature = context.Shop.Where(h => h.ShopID == 123 && h.Type == item.Type).ToList(); 

feature.ForEach(a => a.SortOrder = item.SortOrder); 


} 

context.SaveChanges(); 

} 

希望可以幫助別人。

+0

工程就像一個魅力! – 2017-07-28 07:27:54

+2

這是不好的,你每次調用數據庫來獲取記錄'feature',並且你不應該在'foreach'裏面加上'context.SaveChanges()'它應該在foreach循環之外。 – 2017-11-03 09:43:40

+1

SQL與EF代碼不同。在SQL中,只有一條命令在所有行上運行並更新表。 EF代碼首先獲取所有行,更新DB上更改的行,這意味着如果您有1000個更新行,它將執行1000次sql更新 – 2018-01-15 11:24:12

6

不要在接受的答案中使用ToList()方法!

運行SQL事件探查器,我驗證並發現ToList()函數獲取數據庫中的所有記錄。這是非常糟糕的表現!

string query = "Update YourTable Set ... Where ...";  
context.Database.ExecuteSqlCommandAsync(query, new SqlParameter("@ColumnY", value1), new SqlParameter("@ColumnZ", value2)); 

這將在操作一次性更新,而不選擇連一行:

如下,我會運行通過純SQL命令該查詢。