Jakiś czas temu napisałem czteroczęściową serię blogów (części 1 , 2 , 3 i 4 ) obejmującą wykonywanie zbiorczych aktualizacji (za pomocą jednego polecenia) w Entity Framework.
Chociaż głównym celem tej serii była aktualizacja, zdecydowanie można było użyć zasad, aby usunąć.
Więc powinieneś móc napisać coś takiego:
var query = from c in ctx.Customers
where c.SalesPerson.Email == "..."
select c;
query.Delete();
Wszystko, co musisz zrobić, to zaimplementować metodę rozszerzenia Delete (). Zobacz serię postów, aby uzyskać wskazówki, jak ...
Mam nadzieję że to pomoże
using (var context = new DatabaseEntities()) { // delete existing records context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId); }
źródło
Odpowiedzi, które widzę tutaj, to Linq do Sql
DeleteAllOnSubmit jest częścią System.Data.Linq i ITable, czyli Linq to Sql
Nie można tego zrobić za pomocą Entity Framework.
Powiedziawszy to wszystko, nie mam jeszcze rozwiązania, ale wrócę, gdy to zrobię
źródło
Dla tych, którzy używają EF6 i chcą wykonać zapytanie SQL wiersza w celu usunięcia:
using (var context = new DatabaseEntities()) { // delete existing records context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter); }
źródło
RemoveRange został wprowadzony w EF6, może usunąć listę obiektów. Super łatwe.
var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList(); db.PermitOrigins.RemoveRange(origins); db.SaveChanges();
źródło
Znam metodę DeleteAllOnSubmit dowolnego kontekstu danych, która usunie wszystkie rekordy w zapytaniu. Musi istnieć jakaś optymalizacja, ponieważ wiele obiektów jest usuwanych. Nie jestem jednak pewien.
źródło
Nie jestem pewien, jak wydajne byłoby to, ale możesz spróbować czegoś takiego:
// 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();
źródło
Mógłbyś napisać przechowywany proces, który usuwa i wywołuje go z LINQ. Usuwanie oparte na zestawie jest prawdopodobnie ogólnie szybsze, ale jeśli wpływa na zbyt wiele rekordów, możesz spowodować problemy z blokowaniem i możesz potrzebować hybrydy przechodzenia przez zestawy rekordów (może 2000 naraz, rozmiar zależy od projektu bazy danych, ale 2000 to jeśli okaże się, że usuwanie oparte na zestawie zajmuje tak dużo czasu, że wpływa na inne użycie tabeli), aby wykonać usunięcie.
źródło
Usuwanie danych za pośrednictwem Entity Framework polega na użyciu metody DeleteObject. Możesz wywołać tę metodę w EntityCollection dla klasy jednostki, którą chcesz usunąć, lub w pochodnym ObjectContext. Oto prosty przykład:
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();
źródło
W tym przykładzie otrzymuję rekordy do usunięcia i dołączam je pojedynczo do zestawu wyników, a następnie żądam ich usunięcia. Wtedy mam 1 zapisz zmiany.
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(); } }
źródło
jest to najszybsza metoda usuwania rekordu z bazy danych przy użyciu EF
źródło
Zrobiłbym coś takiego:
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(); } }
Nie sądzę, aby można to zrobić bez pętli, ponieważ Entity Framework działa z Entity i przez większość czasu oznacza to kolekcję obiektów.
źródło