web-dev-qa-db-ja.com

ObjectContextを使用してオブジェクトのリストを削除するにはどうすればよいですか?

このようなコードがあるとします。

using (CustomerContext db = new CustomerContext())
{
   var foundCustList=db.Customers.Where(c=>c.State=='-1').ToList();//Find all the customer which State is -1
   foreach(var c in foundCustList)
   {
       db.DeleteObject(c);
   }
   db.SaveChanges();//After all the customer is deleted, Commit.
}

しかし、知りたいオブジェクトのリストを簡単に削除する方法はありますか? foreachを使用してリストに対して1つずつ実行したくありません。ありがとう。

12
Joe.wang

Nugetから入手できる EntityFramework.Extended ライブラリを使用できます(using EntityFramework.Extensions;を追加することを忘れないでください):

db.Customers.Delete(c => c.State == '-1');

または、拡張メソッドを手動で作成することもできます。

public static void DeleteObjects<T>(this ObjectSet<T> set, 
                                    IEnumerable<T> entities)
    where T : EntityObject
{
    foreach (var entity in entities)
        set.DeleteObject(entity);
}

使用法:

var customersToDelete = db.Customers.Where(c => c.State == '-1');
db.Customers.DeleteObjects(customersToDelete);

またはより良いもの:

public static void DeleteObjects<T>(this ObjectSet<T> set, 
                                    Expression<Func<T, bool>> predicate)
    where T : EntityObject
{
    foreach (var entity in set.AsQueryable<T>().Where(predicate))
        set.DeleteObject(entity);
}

使用法:

db.Customers.DeleteObjects(c => c.State == '-1');
15

構文が非推奨になり、代わりに単純なクエリを削除するため、上記の受け入れられた回答は古くなっています:

db.Customers.Where(c => c.State == '-1').Delete();
9
iGanja
db.Customers.Where(c => c.State == '-1').ToList().ForEach(db.DeleteObject);
db.SaveChanges();

必要なのはそれだけです。

6
Sidharth Mudgal

Entity Framework Core

3.1 3.0 2.2 2.1 2.0 1.1 1.0

using (CustomerContext db = new CustomerContext())
{
    var foundCustList=db.Customers.Where(c=>c.State=='-1').ToList();//Find all the customer which State is -1
    db.Customers.RemoveRange(foundCustList);
    db.SaveChanges();//After all the customer is deleted, Commit.
}

概要

セットの基礎となるコンテキストから特定のエンティティのコレクションを削除し、各エンティティを削除済み状態にして、SaveChangesが呼び出されたときにデータベースから削除されるようにします。

備考

System.Data.Entity.Infrastructure.DbContextConfiguration.AutoDetectChangesEnabledがtrue(デフォルト)に設定されている場合、DetectChangesはエンティティを削除する前に一度呼び出され、再度呼び出されることはないことに注意してください。これは、状況によっては、RemoveRangeを複数回呼び出すよりもパフォーマンスが大幅に向上する場合があることを意味します。追加状態のコンテキストにエンティティが存在する場合、このメソッドによってエンティティがコンテキストから切り離されることに注意してください。これは、追加されたエンティティがデータベースに存在しないと想定されているため、削除しようとしても意味がないためです。

0