web-dev-qa-db-ja.com

LINQを使用してレコードを更新する

行のサブセットのテーブルに値を設定する必要があります。 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);
46
Craig

これが最も効果的でした。

(from p in Context.person_account_portfolio 
 where p.person_id == personId select p).ToList()
                                        .ForEach(x => x.is_default = false);

Context.SaveChanges();
52
Craig

person_idPersonテーブルの主キーであると想定しているため、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();
54
ekad

受け入れられた答えに加えて、LINQメソッドの構文を使用すると、コードの一貫性が向上する場合があります。

Context.person_account_portfolio
.Where(p => person_id == personId)
.ToList()
.ForEach(x => x.is_default = false);

.ForEach()はList<T>ではなくIEnumerable<T>でのみ定義されるため、.ToList()が必要です。ループを実行する前に、.ToList()がクエリを実行し、データベースから一致するすべての行をロードすることに注意してください。

9
ChriPf

私の知る限り、2つの選択肢があります。

  1. クエリを実行し、クエリを繰り返してエンティティを変更し、SaveChanges()を呼び出します。
  2. 質問の冒頭で述べたようなSQLコマンドを実行します。これを行う方法を確認するには、 このページ をご覧ください。

オプション2を使用すると、Entity Frameworkが提供する抽象化の一部が失われますが、非常に大規模な更新を実行する必要がある場合は、パフォーマンス上の理由からこれが最良の選択です。

6
Steve

はい。 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は、即時クエリ評価を強制します。

したがって、foreachupdateに使用しても、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
}  

私はそれが役立つことを願っています...

3
ManirajSS

はい、すべてのレコードを取得して更新し、SaveChangesを呼び出す必要があります。

2
MarcinJuraszek

奇妙なことに、私にとってはSaveChangesではなくSubmitChangesです。

    foreach (var item in w)
    {
        if (Convert.ToInt32(e.CommandArgument) == item.ID)
        {
            item.Sort = 1;
        }
        else
        {
            item.Sort = null;
        }
        db.SubmitChanges();            
    }                   
1
boateng
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>
0
SHUBHASIS