行のサブセットのテーブルに値を設定する必要があります。 SQLでは、これを行います:
UPDATE dbo.Person SET is_default = 0 WHERE person_id = 5
LINQでこれを行う方法はありますか?
私は現在使用しています:
var result = (from p in Context.People....)
表記法。
使用できる更新方法はありますか?または、すべてのレコードを取得してから、Foreachで1つずつ更新する必要がありますか?
これが可能であれば、これが最も効率的な方法ですか?
(from p in Context.person_account_portfolio where p.person_id == personId select p)
.ToList()
.ForEach(
x =>
x.is_default =
false);
これが最も効果的でした。
(from p in Context.person_account_portfolio
where p.person_id == personId select p).ToList()
.ForEach(x => x.is_default = false);
Context.SaveChanges();
person_id
がPerson
テーブルの主キーであると想定しているため、1つのレコードを更新する方法は次のとおりです。
Person result = (from p in Context.Persons
where p.person_id == 5
select p).SingleOrDefault();
result.is_default = false;
Context.SaveChanges();
複数のレコードを更新する方法は次のとおりです。
List<Person> results = (from p in Context.Persons
where .... // add where condition here
select p).ToList();
foreach (Person p in results)
{
p.is_default = false;
}
Context.SaveChanges();
受け入れられた答えに加えて、LINQメソッドの構文を使用すると、コードの一貫性が向上する場合があります。
Context.person_account_portfolio
.Where(p => person_id == personId)
.ToList()
.ForEach(x => x.is_default = false);
.ForEach()はList<T>
ではなくIEnumerable<T>
でのみ定義されるため、.ToList()
が必要です。ループを実行する前に、.ToList()
がクエリを実行し、データベースから一致するすべての行をロードすることに注意してください。
私の知る限り、2つの選択肢があります。
SaveChanges()
を呼び出します。オプション2を使用すると、Entity Frameworkが提供する抽象化の一部が失われますが、非常に大規模な更新を実行する必要がある場合は、パフォーマンス上の理由からこれが最良の選択です。
はい。 foreachを使用して、linqのレコードを更新できます。パフォーマンスの低下はありません。
c#2.0で導入された yield コンストラクトを使用して、標準の Where 演算子が実装されていることを確認できます。
yieldの使用には興味深い利点があります これは、foreachステートメントを使用するか、基になるGetEnumeratorメソッドとMoveNextメソッドを手動で使用することで、反復されるまでクエリが実際に評価されないことです
例えば、
var query = db.Customers.Where (c => c.Name.StartsWith ("A"));
query = query.Where (c => c.Purchases.Count() >= 2);
var result = query.Select (c => c.Name);
foreach (string name in result) // Only now is the query executed!
Console.WriteLine (name);
例外演算子は次のとおりです:First、ElementAt、Sum、Average、All、Any、ToArray、ToListは、即時クエリ評価を強制します。
したがって、foreach
をupdate
に使用しても、linqの結果を怖がらせる必要はありません。
以下のコードサンプルは、多くのプロパティを更新するのに役立ちます。
var persons = (from p in Context.person_account_portfolio where p.person_name == personName select p);
//TO update using foreach
foreach(var person in persons)
{
//update property values
}
私はそれが役立つことを願っています...
はい、すべてのレコードを取得して更新し、SaveChanges
を呼び出す必要があります。
奇妙なことに、私にとってはSaveChangesではなくSubmitChangesです。
foreach (var item in w)
{
if (Convert.ToInt32(e.CommandArgument) == item.ID)
{
item.Sort = 1;
}
else
{
item.Sort = null;
}
db.SubmitChanges();
}
public ActionResult OrderDel(int id)
{
string a = Session["UserSession"].ToString();
var s = (from test in ob.Order_Details where test.Email_ID_Fk == a && test.Order_ID == id select test).FirstOrDefault();
s.Status = "Order Cancel By User";
ob.SaveChanges();
//foreach(var updter in s)
//{
// updter.Status = "Order Cancel By User";
//}
return Json("Sucess", JsonRequestBehavior.AllowGet);
} <script>
function Cancel(id) {
if (confirm("Are your sure ? Want to Cancel?")) {
$.ajax({
type: 'POST',
url: '@Url.Action("OrderDel", "Home")/' + id,
datatype: 'JSON',
success: function (Result) {
if (Result == "Sucess")
{
alert("Your Order has been Canceled..");
window.location.reload();
}
},
error: function (Msgerror) {
alert(Msgerror.responseText);
}
})
}
}
</script>