Pertanyaan Penghapusan massal di LINQ menjadi Entitas


Adakah cara untuk menghapus sebagian besar objek yang cocok dengan kueri yang diberikan di LINQ atau LINQ-to-Entities? Satu-satunya referensi yang dapat saya temukan sudah ketinggalan jaman, dan tampaknya konyol untuk berulang dan menghapus secara manual semua objek yang ingin saya hapus.


76
2018-05-15 15:02


asal


Jawaban:


Pertanyaannya adalah yang lama (dari sebelum EF5 ada). Untuk siapa saja yang menggunakan EF5, EntityFramework.Extended melakukan ini dalam sekejap.


28
2017-11-22 15:17



Beberapa waktu lalu saya menulis 4 bagian seri blog (Bagian 1, 2, 3 dan 4) mencakup melakukan pembaruan massal (dengan satu perintah) dalam Kerangka Badan.

Sementara fokus dari seri itu adalah pembaruan, Anda pasti bisa menggunakan prinsip yang terlibat untuk menghapus.

Jadi Anda harus bisa menulis sesuatu seperti ini:

var query = from c in ctx.Customers
            where c.SalesPerson.Email == "..."
            select c;

query.Delete();

Yang perlu Anda lakukan hanyalah mengimplementasikan metode ekstensi Hapus (). Lihat seri pos untuk petunjuk tentang cara ...

Semoga ini membantu


54
2018-05-15 17:59



    using (var context = new DatabaseEntities())
    {
        // delete existing records
        context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
    }

38
2017-07-07 16:07



Jawaban yang saya lihat di sini adalah Linq to Sql

DeleteAllOnSubmit adalah bagian dari System.Data.Linq dan ITable yang Linq ke Sql

Ini tidak dapat dilakukan dengan Entity Framework.

Setelah mengatakan semua itu saya belum memiliki solusi tetapi akan posting kembali ketika saya lakukan


6
2018-03-30 18:57



Bagi mereka yang menggunakan EF6 dan ingin mengeksekusi baris query SQL untuk penghapusan:

using (var context = new DatabaseEntities())
{
    // delete existing records
    context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}

4
2017-07-08 08:15



saya tahu tentang HapusAllOnSubmit metode dari setiap konteks data yang akan menghapus semua catatan dalam query. Harus ada beberapa pengoptimalan yang mendasari karena banyak objek yang sedang dihapus. Saya tidak yakin, lho.


3
2018-05-15 15:07



Saya tidak yakin seberapa efisiennya, tetapi Anda dapat mencoba sesuatu seperti ini:

// deletes all "People" with the name "Joe"
var mypeople = from p in myDataContext.People
               where p.Name == "Joe";
               select p;
myDataContext.People.DeleteAllOnSubmit(mypeople);
myDataContext.SubmitChanges();

2
2018-05-15 15:14



ANDA dapat menulis proc yang tersimpan yang menghapus dan memanggilnya dari LINQ. Penghapusan berbasis-set cenderung lebih cepat secara keseluruhan tetapi jika itu mempengaruhi terlalu banyak catatan, Anda dapat menyebabkan masalah penguncian dan Anda mungkin memerlukan gabungan dari perulangan melalui set catatan (mungkin 2000 pada suatu waktu, ukuran tergantung pada desain database Anda tetapi 2000 adalah tempat awal jika Anda menemukan delte set membutuhkan waktu lama sehingga mempengaruhi penggunaan lain dari tabel) untuk melakukan penghapusan.


1
2018-05-15 17:28



Menghapus data melalui Kerangka Entitas bergantung pada penggunaan metode DeleteObject. Anda dapat memanggil metode ini pada EntityCollection untuk kelas entitas yang ingin Anda hapus atau pada ObjectContext yang diturunkan. Berikut ini contoh sederhana:

NorthwindEntities db = new NorthwindEntities();

IEnumerable<Order_Detail> ods = from o in db.Order_Details
                                where o.OrderID == 12345                                    
                                select o;

foreach (Order_Detail od in ods) 
    db.Order_Details.DeleteObject(od);

db.SaveChanges();

1
2017-11-11 23:12



Saya akan melakukan sesuatu seperti:

var recordsToDelete = (from c in db.Candidates_T where c.MyField == null select c).ToList<Candidates_T>();
if(recordsToDelete.Count > 0)
{
    foreach(var record in recordsToDelete)
    {
        db.Candidate_T.DeleteObject(record);
        db.SaveChanges();
    }
}   

Saya tidak berpikir ada cara untuk melakukannya tanpa loop karena Entity Framework bekerja dengan Entitas dan sebagian besar waktu, ini berarti kumpulan objek.


1
2017-09-19 19:56



Dalam contoh ini saya mendapatkan catatan untuk dihapus, dan satu per satu melampirkannya ke hasil yang ditetapkan kemudian meminta agar dihapus. Lalu aku punya 1 perubahan simpan.

    using (BillingDB db = new BillingDB())
    {
      var recordsToDelete = (from i in db.sales_order_item
                  where i.sales_order_id == shoppingCartId
                  select i).ToList<sales_order_item>();

      if(recordsToDelete.Count > 0)
      {
        foreach (var deleteSalesOrderItem in recordsToDelete)
        {                  
            db.sales_order_item.Attach(deleteSalesOrderItem);
            db.sales_order_item.Remove(deleteSalesOrderItem);                  
        }
        db.SaveChanges();
      } 
    }

1
2018-02-10 14:09