2012-04-25 90 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命令该查询。