12

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

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私はリストのためにそれを一つずつ行うために使用したくありません。ありがとう。

4

4 に答える 4

15

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');
于 2012-12-14T06:52:50.417 に答える
10

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

db.Customers.Where(c => c.State == '-1').Delete();
于 2016-07-01T01:15:06.563 に答える
6
db.Customers.Where(c => c.State == '-1').ToList().ForEach(db.DeleteObject);
db.SaveChanges();

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

于 2012-12-14T06:34:33.410 に答える
3

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を複数回呼び出すよりもパフォーマンスが大幅に向上する場合があることを意味します。追加状態のコンテキストにエンティティが存在する場合、このメソッドによってエンティティがコンテキストから切り離されることに注意してください。これは、追加されたエンティティがデータベースに存在しないと想定されているため、削除しようとしても意味がないためです。

于 2020-01-07T07:59:41.483 に答える