103

桌子:

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

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

我将如何编写查询来更新上述内容?所有friendids状态都是真实的。[一次2,3,4]?

4

3 回答 3

254

要在此处更新一列,请使用一些语法选项:

选项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();
}

更新

根据评论中的要求,展示如何更新多个列可能是有意义的。因此,为了本练习的目的,假设我们不仅要更新statusat 。我们想要更新name和匹配status的地方。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()
于 2012-04-25T11:27:25.390 回答
26

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

运行 SQL 探查器,我验证并发现该ToList()函数从数据库中获取所有记录。性能真的很差!!

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

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

这将一次性操作更新,而无需选择一行。

于 2017-03-07T11:34:23.877 回答
4

这就是我所做的:

英法:

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();
}

希望能帮助某人。

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

于 2016-07-30T18:37:00.110 回答