テーブル:
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]。
ありがとう
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
が一致する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();
}
オプション
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()
しない受け入れられた答えのようにToList()
メソッドを使用します!
SQLプロファイラーを実行すると、ToList()
関数がデータベースからすべてのレコードを取得することが確認されました。それは本当に悪いパフォーマンスです!!
次のように、純粋なsqlコマンドでこのクエリを実行します。
string query = "Update YourTable Set ... Where ...";
context.Database.ExecuteSqlCommandAsync(query, new SqlParameter("@ColumnY", value1), new SqlParameter("@ColumnZ", value2));
これにより、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();
}
希望は誰かを助ける。