Массовое удаление в LINQ для объектов

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

Ответ 1

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

Ответ 2

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

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

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

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

query.Delete();

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

// 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();

Ответ 8

Вы можете написать сохраненный процесс, который выполняет удаление и вызывает его из LINQ. Удаление на основе набора данных, скорее всего, происходит быстрее, но если оно влияет на слишком много записей, вы можете вызвать проблемы с блокировкой, и вам может понадобиться гибрид циклов с помощью наборов записей (возможно, 2000 за раз, размер зависит от дизайна вашей базы данных, но 2000 - это если вы обнаружите, что дельта set-based занимает так много времени, что это влияет на другое использование таблицы), чтобы выполнить удаление.

Ответ 9

Удаление данных через Entity Framework зависит от метода DeleteObject. Вы можете вызвать этот метод в EntityCollection для класса сущности, который вы хотите удалить, или из производного объекта ObjectContext. Вот простой пример:

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();

Ответ 10

Я бы сделал что-то вроде:

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();
    }
}   

Я не думаю, что есть способ сделать это без цикла, поскольку Entity Framework работает с Entities и большую часть времени, это означает сбор объектов.

Ответ 11

В этом примере я получаю записи для удаления и один за другим присоединяю их к набору результатов, затем запрашиваю их удаление. Затем у меня есть 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();
      } 
    }

Ответ 12

 context.Entity.Where(p => p.col== id)
               .ToList().ForEach(p => db.Entity.DeleteObject(p));

это самый быстрый способ удалить запись из БД с помощью EF

Ответ 13

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

var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList();
db.PermitOrigins.RemoveRange(origins);
db.SaveChanges();