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

use*_*131 89 c# linq entity-framework 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
Run Code Online (Sandbox Code Playgroud)

如果用户发送userid = 1,则friendids = 2,4,5 status = true

请告诉我如何更新以上所有friendids状态的查询是真的.[2,3,4一次].?

谢谢

Ari*_*ion 223

要在此处更新一列是一些语法选项:

选项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();
}
Run Code Online (Sandbox Code Playgroud)

选项2

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

     db.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)

选项3

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

更新

根据评论中的要求,显示如何更新多个列可能是有意义的.因此,为了本练习的目的,我们不仅要更新statusat.我们要更新name,并statusfriendid被匹配.以下是一些语法选项:

选项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();
}
Run Code Online (Sandbox Code Playgroud)

选项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();
}
Run Code Online (Sandbox Code Playgroud)

选项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();
}
Run Code Online (Sandbox Code Playgroud)

更新2

在答案中我使用LINQ to SQL,在这种情况下提交到数据库的用法是:

db.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)

但是对于Entity Framework提交更改,它是:

db.SaveChanges()
Run Code Online (Sandbox Code Playgroud)

  • 对于多个注释,您需要执行:`records.ForEach(x => {x.Deleted = true; x.DeletedByUserID = deletedByUserId; x.DeletedOn = DateTime.Now;});; (6认同)
  • ......所有三个选项都是一样的.事实上,前两者之间的唯一区别是,一个使用变量而一个不使用.两者都只是增加了噪音. (3认同)
  • 有没有`ToList()`吗?这是一个杀手 (3认同)
  • 应该不是db.SaveChanges()而不是db.SubmitChanges()吗? (2认同)
  • 注意:这将生成一个单独的 SQL 更新查询 *per* Row。在这种情况下不是,但*如果*#行是“重要的”(即mil,k甚至100),您可能希望通过嵌入式SQL或Stored Proc使用单个SQL更新查询。来源:“https://social.msdn.microsoft.com/Forums/en-US/0f014318-5259-43c7-8518-06948cec465e/updating-multiple-rows-using-linq?forum=linqprojectgeneral” (2认同)
  • ToList() 是否根据条件从数据库中获取所有记录,不是吗?如果是这样,那性能真的很差,如果有几百万条记录,我们将它们加载到内存中来运行这个函数怎么办?如果我错了,请纠正我。 (2认同)

Jac*_*cob 20

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

运行SQL事件探查器,我验证并发现该ToList()函数从数据库中获取所有记录.这真是糟糕的表现!!

我会通过pure sql命令运行此查询,如下所示:

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

这将在一次性操作中进行更新而不选择甚至一行.


sto*_*tom 6

这就是我所做的:

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();
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助某人。

注意: 5年后,正如评论中所说,这不是一个好的选择,因为我正在进行数据库调用以获取内部的一些数据foreach。如果您不这样做,那么可以使用。

  • 这很糟糕,您每次都调用数据库来获取记录“feature”,而且您不应该在“foreach”内添加“context.SaveChanges()”,它应该在 foreach 循环之外。 (5认同)
  • @stom ExecuteSqlCommand 出于此目的存在于 EF 上,但我同意它并不漂亮:) 无论如何,我的观点是您已经编写了一个 SQL 命令和不同的 EF-C# 代码,并声称它们是相等的。:) (2认同)