web-dev-qa-db-ja.com

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

ユーザーがuserid = 1、friendids = 2,4,5 status = trueを送信した場合

上記のすべてのfriendidsステータスを更新する方法のクエリを教えてください。 [一度に2,3,4]。

ありがとう

82
user1237131

1つの列を更新するには、いくつかの構文オプションがあります。

オプション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();
}

オプション

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

更新

コメントで要求されているように、複数の列を更新する方法を示すことは理にかなっているかもしれません。したがって、この演習の目的のために、status at atを更新するだけではない、としましょう。 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();
}

オプション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();
}

オプション

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

ただし、Entity Frameworkが変更をコミットする場合は次のとおりです。

db.SaveChanges()
215
Arion

しない受け入れられた答えのようにToList()メソッドを使用します!

SQLプロファイラーを実行すると、ToList()関数がデータベースからすべてのレコードを取得することが確認されました。それは本当に悪いパフォーマンスです!!

次のように、純粋なsqlコマンドでこのクエリを実行します。

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

これにより、1行も選択せずに、ワンショットで更新が実行されます。

18
Jacob

これは私がやったことです:

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

希望は誰かを助ける。

2
stom