Массовое удаление в LINQ to Entities - PullRequest
79 голосов
/ 15 мая 2009

Есть ли способ массового удаления группы объектов, соответствующих заданному запросу, в LINQ или LINQ-to-Entities? Единственные ссылки, которые я могу найти, устарели, и кажется глупым перебирать и вручную удалять все объекты, которые я хочу удалить.

Ответы [ 13 ]

55 голосов
/ 15 мая 2009

Некоторое время назад я написал серию блогов из 4 частей (Части 1 , 2 , 3 и 4 ), занимающихся массовым исполнением. обновления (одной командой) в Entity Framework.

В то время как в центре внимания этой серии было обновление, вы, безусловно, могли бы использовать принципы, используемые для удаления.

Так что вы должны быть в состоянии написать что-то вроде этого:

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

query.Delete();

Все, что вам нужно сделать, это реализовать метод расширения Delete (). Смотрите серию сообщений для подсказок о том, как ...

Надеюсь, это поможет

40 голосов
/ 07 июля 2011
    using (var context = new DatabaseEntities())
    {
        // delete existing records
        context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
    }
29 голосов
/ 22 ноября 2012

Вопрос старый (до появления EF5). Для тех, кто использует EF5, EntityFramework.Extended делает это за мгновение.

6 голосов
/ 30 марта 2010

Ответы, которые я вижу здесь, это Linq to Sql

DeleteAllOnSubmit является частью System.Data.Linq и ITable, которая является Linq to Sql

Это невозможно сделать с помощью Entity Framework.

Сказав все это, у меня пока нет решения, но я отправлю ответ, когда сделаю

4 голосов
/ 08 июля 2014

Для тех, кто использует EF6 и хочет выполнить SQL-запрос строки для удаления:

using (var context = new DatabaseEntities())
{
    // delete existing records
    context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}
2 голосов
/ 15 мая 2009

Я не уверен, насколько это будет эффективно, но вы можете попробовать что-то вроде этого:

// 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 голосов
/ 15 мая 2009

Я знаю о DeleteAllOnSubmit метод любого контекста данных, который удалит все записи в запросе. В основе должна лежать некоторая оптимизация, поскольку многие объекты удаляются. Хотя я не уверен.

1 голос
/ 27 февраля 2017

RemoveRange был представлен в EF6, он может удалить список объектов. Супер просто.

var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList();
db.PermitOrigins.RemoveRange(origins);
db.SaveChanges();
1 голос
/ 09 мая 2015
 context.Entity.Where(p => p.col== id)
               .ToList().ForEach(p => db.Entity.DeleteObject(p));

это самый быстрый способ удаления записи из БД с использованием EF

1 голос
/ 10 февраля 2015

В этом примере я получаю удаляемые записи и поочередно прикрепляю их к набору результатов, затем запрашиваю их удаление. Тогда у меня есть 1 сохранить изменения.

    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();
      } 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...