Есть ли способ массового удаления целого ряда объектов, соответствующих заданному запросу в LINQ или LINQ-to-Entities? Единственные ссылки, которые я могу найти, устарели, и кажется глупым перебирать и вручную удалять все объекты, которые я хочу удалить.
Массовое удаление в LINQ для объектов
Ответ 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();