Bagaimana cara menghapus beberapa baris di Entity Framework (tanpa foreach)

305

Saya menghapus beberapa item dari tabel menggunakan Entity Framework. Tidak ada objek kunci asing / induk jadi saya tidak bisa menangani ini dengan OnDeleteCascade.

Saat ini saya sedang melakukan ini:

var widgets = context.Widgets
    .Where(w => w.WidgetId == widgetId);

foreach (Widget widget in widgets)
{
    context.Widgets.DeleteObject(widget);
}
context.SaveChanges();

Ini bekerja tetapi foreach menggangguku. Saya menggunakan EF4 tetapi saya tidak ingin menjalankan SQL. Saya hanya ingin memastikan saya tidak melewatkan apa pun - ini sebagus yang didapat, bukan? Saya bisa abstrak dengan metode ekstensi atau pembantu, tetapi di suatu tempat kita masih akan melakukan foreach, kan?

Jon Galloway
sumber
1
Anda mungkin ingin meninjau kembali jawaban yang diterima.
Eric J.
1
Jika Anda ingin tetap tampil mungkin Anda mungkin ingin memeriksa jawaban saya di sini stackoverflow.com/a/35033286/274589
Adi

Jawaban:

49

Jika Anda tidak ingin menjalankan SQL langsung memanggil DeleteObject dalam satu lingkaran adalah yang terbaik yang dapat Anda lakukan hari ini.

Namun Anda dapat menjalankan SQL dan tetap membuatnya menjadi tujuan umum sepenuhnya melalui metode ekstensi, menggunakan pendekatan yang saya jelaskan di sini .

Meskipun jawaban itu untuk 3.5. Untuk 4.0 saya mungkin akan menggunakan API ExecuteStoreCommand baru di bawah tenda, alih-alih turun ke StoreConnection.

Alex James
sumber
ExecuteStoreCommand bukan cara yang tepat. Hapus AllSubmit bekerja di linq ke sql tetapi tidak dalam kerangka entitas. Saya ingin opsi yang sama dalam kerangka entitas.
Hiral
653

EntityFramework 6 membuatnya lebih mudah .RemoveRange() .

Contoh:

db.People.RemoveRange(db.People.Where(x => x.State == "CA"));
db.SaveChanges();
Kyle
sumber
31
Itulah tepatnya yang kami butuhkan ... Kecuali ketika saya menggunakannya pada rentang yang cukup besar, saya mendapatkan pengecualian di luar memori! Saya pikir inti dari RemoveRange adalah untuk melewatkan pemrosesan ke database, tetapi ternyata tidak.
Samer Adra
ini WAAAYYYY lebih cepat daripada mengatur status Dihapus untuk setiap entitas!
Jerther
54
Tentu saja jawaban ini lebih mudah tetapi dari segi kinerja mungkin tidak terlalu bagus. Mengapa? apa doet ini sama dengan menghapusnya dalam loop foreach, pertama mengambil semua baris dan kemudian menghapus adalah satu per satu, hanya mendapatkan untuk menyimpan "DetectChanges akan dipanggil sekali sebelum menghapus entitas dan tidak akan dipanggil lagi" sisanya sama, coba gunakan alat untuk melihat sql yang dihasilkan.
Anshul Nigam
6
Untuk rentang yang cukup besar, coba sesuatu seperti. Ambil (10000) dan putar sampai RemoveRange (...). Count () == 0.
Eric J.
20
Masalahnya adalah bahwa parameter input RemoveRange adalah IEnumerable sehingga untuk melakukan delete itu menghitung semua entitas dan menjalankan 1 DELETE permintaan per entitas.
bubi
74

ini sebagus yang didapat, kan? Saya bisa abstrak dengan metode ekstensi atau pembantu, tetapi di suatu tempat kita masih akan melakukan foreach, kan?

Ya, kecuali Anda bisa membuatnya menjadi dua baris:

context.Widgets.Where(w => w.WidgetId == widgetId)
               .ToList().ForEach(context.Widgets.DeleteObject);
context.SaveChanges();
Klaus Byskov Pedersen
sumber
76
Anda sedang melakukan ToList () yang mengalahkan tujuan. Bagaimana itu berbeda dari solusi asli?
lahsrah
3
Saya memiliki masalah karena saya hanya memiliki metode Hapus dalam objek konteks.
Pnct
2
Ini jelas bukan solusi yang cocok ketika satu juta baris (atau bahkan beberapa ratus) diharapkan. Namun jika kita tahu pasti hanya akan ada beberapa baris solusi ini rapi dan berfungsi dengan baik. Ya, itu akan melibatkan beberapa perjalanan pulang pergi ke DB, tetapi menurut saya abstraksi yang hilang yang terlibat dalam memanggil SQL secara langsung melebihi manfaatnya.
Yogster
Kerangka Entitas, seperti namanya, berfungsi paling baik dengan data di tingkat entitas. Operasi data massal paling baik ditangani oleh procs tersimpan lama yang baik. Dari segi kinerja, mereka sejauh ini merupakan pilihan terbaik dan akan mengalahkan logika EF apa pun yang membutuhkan perulangan.
Paceman
72
using (var context = new DatabaseEntities())
{
    context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
}
Vlad Bezden
sumber
Tetapi bagaimana Anda bisa melakukan ini dengan daftar id? Solusi ini tidak menangani "daftar" dengan sangat baik.
JesseNewman19
11
@ JesseNewman19 Jika Anda sudah memiliki daftar ID, gunakan a WHERE IN ({0}), dan argumen kedua seharusnya String.Join(",", idList).
Langdon
@ Longdon yang tidak akan berfungsi, karena itu akan mengirim perintah ke sql seperti: WHERE IN ("1, 2, 3"). Basis data kemudian melempar kesalahan karena Anda memberikannya string, bukan daftar bilangan bulat.
JesseNewman19
Saya ingin membuat pernyataan seperti itu dengan LINQ. Hal terdekat yang saya temukan adalah lib. EntityFramework.Extended
Jaider
Jika Anda menggunakan String.Join, Anda mungkin perlu menggunakan string.Formatdan meneruskan string SQL yang sudah terbentuk ke perintah. Selama daftar Anda hanya memiliki bilangan bulat, tidak ada risiko serangan injeksi. Periksa pertanyaan ini: bagaimana saya bisa meneruskan array ke perintah eksekusi toko?
Andrew
50

Saya tahu ini cukup terlambat tetapi jika seseorang membutuhkan solusi sederhana, hal yang keren adalah Anda juga dapat menambahkan klausa di mana dengannya:

public static void DeleteWhere<T>(this DbContext db, Expression<Func<T, bool>> filter) where T : class
{
    string selectSql = db.Set<T>().Where(filter).ToString();
    string fromWhere = selectSql.Substring(selectSql.IndexOf("FROM"));
    string deleteSql = "DELETE [Extent1] " + fromWhere;
    db.Database.ExecuteSqlCommand(deleteSql);
}

Catatan: baru diuji dengan MSSQL2008.

Memperbarui:

Solusi di atas tidak akan berfungsi ketika EF menghasilkan pernyataan sql dengan parameter , jadi inilah pembaruan untuk EF5 :

public static void DeleteWhere<T>(this DbContext db, Expression<Func<T, bool>> filter) where T : class
{
    var query = db.Set<T>().Where(filter);

    string selectSql = query.ToString();
    string deleteSql = "DELETE [Extent1] " + selectSql.Substring(selectSql.IndexOf("FROM"));

    var internalQuery = query.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Where(field => field.Name == "_internalQuery").Select(field => field.GetValue(query)).First();
    var objectQuery = internalQuery.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Where(field => field.Name == "_objectQuery").Select(field => field.GetValue(internalQuery)).First() as ObjectQuery;
    var parameters = objectQuery.Parameters.Select(p => new SqlParameter(p.Name, p.Value)).ToArray();

    db.Database.ExecuteSqlCommand(deleteSql, parameters);
}

Ini membutuhkan sedikit refleksi tetapi bekerja dengan baik.

Thanh Nguyen
sumber
Apa itu DbContext? Saya menganggap konteks kerangka entitas yang dibuat secara otomatis? Saya tidak memiliki metode yang disebut Set <T>.
Stealth Rabbi
@Stealth: Ya, ini konteks data EF Anda, saya menggunakan kode-pertama tetapi konteks yang dihasilkan secara otomatis harus sama. Maaf untuk pernyataan yang salah ketik itu harus diatur <T> () (perusahaan saya membatasi akses internet saya tidak bisa menempelkan kode, harus mengetik dengan tangan jadi ...), kode diperbarui :)
Thanh Nguyen
3
Ini adalah satu-satunya jawaban yang benar-benar menjawab pertanyaan! Setiap jawaban lainnya menghapus setiap item satu per satu, tidak bisa dipercaya.
Rocklan
Ini terasa seperti jawaban yang paling benar. Itu memungkinkan penghapusan dengan cara yang sangat umum, dan itu benar memuat pekerjaan ke database dan bukan C #.
JesseNewman19
1
Untuk semua programmer yang kurang teknis di luar sana, saya ingin menguraikan sedikit lebih banyak tentang bagaimana menerapkan solusi yang sangat baik dan generik ini, karena itu akan menghemat waktu beberapa menit! Lanjutan di komentar berikutnya ...
jdnew18
30

Bagi siapa pun yang menggunakan EF5, pustaka ekstensi berikut dapat digunakan: https://github.com/loresoft/EntityFramework.Extended

context.Widgets.Delete(w => w.WidgetId == widgetId);
Marcelo Mason
sumber
3
Memiliki masalah kinerja pada tabel besar, tidak dapat digunakan dalam situasi saya.
Tomas
@ Thomas perfromance apa yang dikeluarkan yang Anda perhatikan? Seberapa parah masalahnya dan seberapa besar meja itu? Adakah yang bisa mengkonfirmasi itu?
Anestis Kivranoglou
Ini sangat cepat dibandingkan dengan alternatif di luar sana
Jaider
Saya tidak dapat melihat Delete()fungsi di entitas saya di EF6.
dotNET
context.Widgets.Where(w => w.WidgetId == widgetId).Delete();adalah cara yang lebih baru dengan EntityFramework.Extended
Peter Kerr
11

Tampaknya masih gila harus menarik kembali apa pun dari server hanya untuk menghapusnya, tetapi paling tidak mendapatkan kembali ID saja jauh lebih ramping daripada menarik entitas lengkap:

var ids = from w in context.Widgets where w.WidgetId == widgetId select w.Id;
context.Widgets.RemoveRange(from id in ids.AsEnumerable() select new Widget { Id = id });
Edward Brey
sumber
Hati-hati - ini bisa gagal validasi entitas Entity Framework karena Widgetobjek rintisan Anda hanya memiliki Idproperti yang diinisialisasi . Cara mengatasinya adalah dengan menggunakan context.Configuration.ValidateOnSaveEnabled = false(setidaknya di EF6). Ini menonaktifkan validasi Entity Framework sendiri, tetapi tentu saja tetap melakukan validasi database sendiri.
Sammy S.
@SammyS. Saya belum mengalaminya, jadi tidak bisa berbicara dengan detail, tetapi tampaknya aneh bahwa EF akan repot-repot dengan validasi ketika itu tetap menghapus baris.
Edward Brey
Anda benar sekali. Saya bingung deletedengan solusi yang sama untuk updateing entitas tanpa memuatnya.
Sammy S.
10

EF 6.1

public void DeleteWhere<TEntity>(Expression<Func<TEntity, bool>> predicate = null) 
where TEntity : class
{
    var dbSet = context.Set<TEntity>();
    if (predicate != null)
        dbSet.RemoveRange(dbSet.Where(predicate));
    else
        dbSet.RemoveRange(dbSet);

    context.SaveChanges();
} 

Pemakaian:

// Delete where condition is met.
DeleteWhere<MyEntity>(d => d.Name == "Something");

Or:

// delete all from entity
DeleteWhere<MyEntity>();
mnsr
sumber
7
Ini secara efektif sama dengan db.People.RemoveRange (db.People.Where (x => x.State == "CA")); db.SaveChanges (); Jadi tidak ada peningkatan kinerja.
ReinierDG
4

Untuk EF 4.1,

var objectContext = (myEntities as IObjectContextAdapter).ObjectContext;
objectContext.ExecuteStoreCommand("delete from [myTable];");
Amit Pawar
sumber
1
Ini berfungsi, tetapi seluruh titik menggunakan Entity Framework memiliki cara berorientasi objek untuk berinteraksi dengan database. Ini hanya secara langsung menjalankan query SQL.
Arturo Torres Sánchez
4

Anda bisa menggunakan ekstensi library untuk melakukannya seperti EntityFramework.Extended atau Z.EntityFramework.Plus.EF6, ada tersedia untuk EF 5, 6 atau Core. Pustaka ini memiliki kinerja yang hebat ketika Anda harus menghapus atau memperbarui dan mereka menggunakan LINQ. Contoh untuk menghapus ( sumber plus ):

ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) .Delete();

atau ( sumber diperluas )

context.Users.Where(u => u.FirstName == "firstname") .Delete();

Ini menggunakan pernyataan SQL asli, jadi kinerjanya bagus.

UUHHIVS
sumber
Bayar $ 600 + untuk generator operasi sql massal. Serius?
nicolay.anykienko
@ nicolay.anykienko Ketika saya menggunakannya, perpustakaan ini gratis, ada operasi lain di mana Anda harus membayar, bukan saya tidak tahu apakah Anda harus membayar
UUHHIVS
3

Cara tercepat untuk menghapus menggunakan prosedur tersimpan. Saya lebih suka prosedur yang tersimpan dalam proyek database daripada SQL dinamis karena penggantian nama akan ditangani dengan benar dan memiliki kesalahan penyusun. SQL dinamis bisa merujuk ke tabel yang telah dihapus / diganti namanya menyebabkan kesalahan waktu berjalan.

Dalam contoh ini, saya memiliki dua Daftar tabel dan Daftar item. Saya perlu cara cepat untuk menghapus semua ListItems dari daftar yang diberikan.

CREATE TABLE [act].[Lists]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY, 
    [Name] NVARCHAR(50) NOT NULL
)
GO
CREATE UNIQUE INDEX [IU_Name] ON [act].[Lists] ([Name])
GO
CREATE TABLE [act].[ListItems]
(
    [Id] INT NOT NULL IDENTITY, 
    [ListId] INT NOT NULL, 
    [Item] NVARCHAR(100) NOT NULL, 
    CONSTRAINT PK_ListItems_Id PRIMARY KEY NONCLUSTERED (Id),
    CONSTRAINT [FK_ListItems_Lists] FOREIGN KEY ([ListId]) REFERENCES [act].[Lists]([Id]) ON DELETE CASCADE
)
go
CREATE UNIQUE CLUSTERED INDEX IX_ListItems_Item 
ON [act].[ListItems] ([ListId], [Item]); 
GO

CREATE PROCEDURE [act].[DeleteAllItemsInList]
    @listId int
AS
    DELETE FROM act.ListItems where ListId = @listId
RETURN 0

Sekarang bagian yang menarik dari menghapus item dan memperbarui kerangka kerja Entity menggunakan ekstensi.

public static class ListExtension
{
    public static void DeleteAllListItems(this List list, ActDbContext db)
    {
        if (list.Id > 0)
        {
            var listIdParameter = new SqlParameter("ListId", list.Id);
            db.Database.ExecuteSqlCommand("[act].[DeleteAllItemsInList] @ListId", listIdParameter);
        }
        foreach (var listItem in list.ListItems.ToList())
        {
            db.Entry(listItem).State = EntityState.Detached;
        }
    }
}

Kode utama sekarang dapat menggunakannya adalah sebagai

[TestMethod]
public void DeleteAllItemsInListAfterSavingToDatabase()
{
    using (var db = new ActDbContext())
    {
        var listName = "TestList";
        // Clean up
        var listInDb = db.Lists.Where(r => r.Name == listName).FirstOrDefault();
        if (listInDb != null)
        {
            db.Lists.Remove(listInDb);
            db.SaveChanges();
        }

        // Test
        var list = new List() { Name = listName };
        list.ListItems.Add(new ListItem() { Item = "Item 1" });
        list.ListItems.Add(new ListItem() { Item = "Item 2" });
        db.Lists.Add(list);
        db.SaveChanges();
        listInDb = db.Lists.Find(list.Id);
        Assert.AreEqual(2, list.ListItems.Count);
        list.DeleteAllListItems(db);
        db.SaveChanges();
        listInDb = db.Lists.Find(list.Id);
        Assert.AreEqual(0, list.ListItems.Count);
    }
}
Xavier John
sumber
Terima kasih atas contoh yang baik menggunakan Prosedur Tersimpan, dan kemudian menerapkannya sebagai ekstensi, dengan kode Penggunaan.
glenn garson
3

Jika Anda ingin menghapus semua baris tabel, Anda bisa menjalankan perintah sql

using (var context = new DataDb())
{
     context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");
}

TRUNCATE TABLE (Transact-SQL) Menghapus semua baris dari tabel tanpa mencatat penghapusan baris individu. TRUNCATE TABLE mirip dengan pernyataan DELETE tanpa klausa WHERE; Namun, TRUNCATE TABLE lebih cepat dan menggunakan lebih sedikit sumber daya sistem dan log transaksi.

Amir
sumber
3
Anda juga harus menyebutkan bahwa Anda tidak dapat berjalan truncate tabledi tabel yang direferensikan oleh batasan KUNCI ASING. (Anda dapat memotong tabel yang memiliki kunci asing yang mereferensikannya sendiri.). Dokumentasi MSDN
broadband
2

UUHHIVSIni adalah cara yang sangat elegan dan cepat untuk menghapus batch, tetapi harus digunakan dengan hati-hati:

  • pembuatan otomatis transaksi: kueri akan diliputi oleh transaksi
  • basis data konteks independensi: pelaksanaannya tidak ada hubungannya dengan context.SaveChanges()

Masalah-masalah ini dapat diatasi dengan mengendalikan transaksi. Kode berikut mengilustrasikan bagaimana cara batch batch menghapus dan memasukkan secara transaksional:

var repo = DataAccess.EntityRepository;
var existingData = repo.All.Where(x => x.ParentId == parentId);  

TransactionScope scope = null;
try
{
    // this starts the outer transaction 
    using (scope = new TransactionScope(TransactionScopeOption.Required))
    {
        // this starts and commits an inner transaction
        existingData.Delete();

        // var toInsert = ... 

        // this relies on EntityFramework.BulkInsert library
        repo.BulkInsert(toInsert);

        // any other context changes can be performed

        // this starts and commit an inner transaction
        DataAccess.SaveChanges();

        // this commit the outer transaction
        scope.Complete();
    }
}
catch (Exception exc)
{
    // this also rollbacks any pending transactions
    scope?.Dispose();
}
Alexei
sumber
2

Inti Kerangka Entitas

3.1 3.0 2.2 2.1 2.0 1.1 1.0

using (YourContext context = new YourContext ())
{
    var widgets = context.Widgets.Where(w => w.WidgetId == widgetId);
    context.Widgets.RemoveRange(widgets);
    context.SaveChanges();
}

Ringkasan :

Menghapus koleksi entitas yang diberikan dari konteks yang mendasari set dengan masing-masing entitas dimasukkan ke dalam status Dihapus sehingga akan dihapus dari database ketika SaveChanges dipanggil.

Komentar :

Perhatikan bahwa jika System.Data.Entity.Infrastructure.DbContextConfiguration.AutoDetectChangesEnabled diatur ke true (yang merupakan default), maka DetectChanges akan dipanggil sekali sebelum menghapus entitas apa pun dan tidak akan dipanggil lagi. Ini berarti bahwa dalam beberapa situasi, RemoveRange mungkin berperforma lebih baik daripada memanggil Hapus beberapa kali. Perhatikan bahwa jika ada entitas yang ada dalam konteks di negara Ditambahkan, maka metode ini akan membuatnya terlepas dari konteks. Ini karena entitas yang ditambahkan diasumsikan tidak ada dalam database sehingga mencoba menghapusnya tidak masuk akal.

Nguyen Van Thanh
sumber
1

Anda dapat menjalankan kueri sql secara langsung sebagai berikut:

    private int DeleteData()
{
    using (var ctx = new MyEntities(this.ConnectionString))
    {
        if (ctx != null)
        {

            //Delete command
            return ctx.ExecuteStoreCommand("DELETE FROM ALARM WHERE AlarmID > 100");

        }
    }
    return 0;
}

Untuk pilih kita dapat menggunakan

using (var context = new MyContext()) 
{ 
    var blogs = context.MyTable.SqlQuery("SELECT * FROM dbo.MyTable").ToList(); 
}
Abhishek Sharma
sumber
Mengingat bahwa EF tidak mendukung pemetaan kondisi penghapusan dengan benar, ini mungkin yang terbaik untuk menyelesaikan pekerjaan.
Tony O'Hagan
1

Anda juga dapat menggunakan metode DeleteAllOnSubmit () dengan meneruskannya hasil Anda dalam daftar generik daripada di var. Dengan cara ini, foreach Anda mengurangi menjadi satu baris kode:

List<Widgets> widgetList = context.Widgets
              .Where(w => w.WidgetId == widgetId).ToList<Widgets>();

context.Widgets.DeleteAllOnSubmit(widgetList);

context.SubmitChanges();

Mungkin masih menggunakan loop secara internal.

Hugo Nava Kopp
sumber
3
Sepertinya Anda salah paham apa itu a var.
freedomn-m
1

Jawaban Thanh bekerja paling baik untuk saya. Menghapus semua catatan saya dalam satu perjalanan server. Saya kesulitan benar-benar memanggil metode ekstensi, jadi saya pikir saya akan berbagi milik saya (EF 6):

Saya menambahkan metode ekstensi ke kelas pembantu di proyek MVC saya dan mengubah nama menjadi "RemoveWhere". Saya menyuntikkan dbContext ke dalam pengontrol saya, tetapi Anda juga bisa melakukannya using.

// make a list of items to delete or just use conditionals against fields
var idsToFilter = dbContext.Products
    .Where(p => p.IsExpired)
    .Select(p => p.ProductId)
    .ToList();

// build the expression
Expression<Func<Product, bool>> deleteList = 
    (a) => idsToFilter.Contains(a.ProductId);

// Run the extension method (make sure you have `using namespace` at the top)
dbContext.RemoveWhere(deleteList);

Ini menghasilkan pernyataan penghapusan tunggal untuk grup.

Steve Greene
sumber
0

EF 6. =>

var assignmentAddedContent = dbHazirBot.tbl_AssignmentAddedContent.Where(a =>
a.HazirBot_CategoryAssignmentID == categoryAssignment.HazirBot_CategoryAssignmentID);
dbHazirBot.tbl_AssignmentAddedContent.RemoveRange(assignmentAddedContent);
dbHazirBot.SaveChanges();
Erçin Dedeoğlu
sumber
0

Terbaik: in EF6 => .RemoveRange()

Contoh:

db.Table.RemoveRange(db.Table.Where(x => Field == "Something"));
maXXis
sumber
14
Apa bedanya dengan jawaban Kyle?
-1

Lihat jawaban 'bit kode favorit' yang berfungsi

Inilah cara saya menggunakannya:

     // Delete all rows from the WebLog table via the EF database context object
    // using a where clause that returns an IEnumerable typed list WebLog class 
    public IEnumerable<WebLog> DeleteAllWebLogEntries()
    {
        IEnumerable<WebLog> myEntities = context.WebLog.Where(e => e.WebLog_ID > 0);
        context.WebLog.RemoveRange(myEntities);
        context.SaveChanges();

        return myEntities;
    }
Brian Quinn
sumber
1
Bagaimana jawaban Anda berbeda dari jawaban pengguna1308743 ?
Sergey Berezovskiy
Saya hanya membagikan contoh kerja. Apa pun yang dapat saya lakukan untuk memberi kembali atas bantuan yang saya dapatkan di sini.
Brian Quinn
-3

Di EF 6.2 ini bekerja dengan sempurna, mengirim penghapusan langsung ke database tanpa terlebih dahulu memuat entitas:

context.Widgets.Where(predicate).Delete();

Dengan predikat tetap, ini cukup mudah:

context.Widgets.Where(w => w.WidgetId == widgetId).Delete();

Dan jika Anda memerlukan predikat dinamis, lihat LINQKit (paket Nuget tersedia), sesuatu seperti ini berfungsi dengan baik dalam kasus saya:

Expression<Func<Widget, bool>> predicate = PredicateBuilder.New<Widget>(x => x.UserID == userID);
if (somePropertyValue != null)
{
    predicate = predicate.And(w => w.SomeProperty == somePropertyValue);
}
context.Widgets.Where(predicate).Delete();
Vladimir
sumber
1
Dengan EF 6.2 mentah ini tidak mungkin. Mungkin Anda menggunakan Z.EntityFramework.Plusatau yang serupa? ( entitasframework.net/batch-delete )
Sammy S.
Yang pertama adalah EF 6.2 mentah dan karya ditemukan. Yang kedua adalah, seperti yang saya sebutkan, menggunakan LINQKit.
Vladimir
1
Hmm, saya tidak dapat menemukan metode ini. Bisakah Anda memeriksa di kelas mana dan di mana namespace metode ini berada?
Sammy S.
Saya ketiga itu ( Delete()metode secara inheren tidak ada).
Jumlah Tidak Ada