IDのリストからEntity Frameworkの複数の行を更新する


93

IDのリストを取得し、IDに関連付けられたフィールドを更新できるようにするエンティティフレームワークのクエリを作成しようとしています。

SQLの例:

UPDATE Friends
SET msgSentBy = '1234'
WHERE id IN (1, 2, 3, 4)

上記をエンティティフレームワークに変換するにはどうすればよいですか?


あなたのデータベースプラットフォームは何ですかOracle mysql ..
zee

私のデータベースはMicrosoft SQLです
14

これを可能にする2つのオープンソースプロジェクトがあります。EntityFramework.ExtendedとE ntity Framework Extensionsです。
Peter Kerr、

回答:


164

以下のようなもの

var idList=new int[]{1, 2, 3, 4};
using (var db=new SomeDatabaseContext())
{
    var friends= db.Friends.Where(f=>idList.Contains(f.ID)).ToList();
    friends.ForEach(a=>a.msgSentBy='1234');
    db.SaveChanges();
}

更新:

以下のように複数のフィールドを更新できます

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });

送信した上記のforeachの複数のフィールドを更新できますか?あなたがもっとできるかどうかだけ知りたいですか?また、SubmitChangesが正常に機能するようにも見えません。最新のエンティティフレームワークを使用しています。たぶんSaveChanges()?
2014

10
ForEachListはのメソッドであり、あまり機能的なプログラミング方法ではないため、通常は使用しないことをお勧めします。foreach (オペレーター)を普通の人と同じように使うだけです。
BlueRaja-Danny Pflughoeft 2015

53
このソリューションを使用すると、リスト内の要素ごとに1つの更新クエリが生成されます。質問のようにEFに1つのクエリのみを実行させる方法はありますか?(UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...)
RamNow、2015年

19
これは、データベースの観点からこれに取り組むにはかなり非効率的な方法であることに注意してください。これは、Friendsテーブルのすべての行を含む大きなselectステートメントを発行するだけでなく、更新されるすべてのレコードに対して個別のUPDATEコマンドを発行します。したがって、1つのコマンドを発行するのではなく、多くのコマンドを発行したり、データベースから大量のデータをストリーミングしたりする可能性があります。
d512 2016

1
@ShekharPankaj、基本的には、「UPDATE Friends SET msgSentBy = '1234' WHERE ID IN(1、2、3、4)」のようなSQLコマンドを発行します。EFがそれを直接サポートしているとは思いません。これにはいくつかのサードパーティのソリューションがあると思いますが(stackoverflow.com/questions/12751258/batch-update-delete-ef5)、私はそれらを使用していません。他のオプションは、EFの代わりに生のADO.NETを使用することです。
d512 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.