Чи є спосіб масового видалення групи об’єктів, що відповідають даному запиту, у LINQ або LINQ-to-Entities? Єдині посилання, які я можу знайти, застарілі, і здається безглуздим переглядати та видаляти вручну всі об’єкти, які я хочу видалити.
Чи є спосіб масового видалення групи об’єктів, що відповідають даному запиту, у LINQ або LINQ-to-Entities? Єдині посилання, які я можу знайти, застарілі, і здається безглуздим переглядати та видаляти вручну всі об’єкти, які я хочу видалити.
Відповіді:
Питання старе (ще до існування EF5). Для тих, хто використовує EF5 , EntityFramework.Extended робить це швидко.
Деякий час тому я написав 4-серійну серію блогів (частини 1 , 2 , 3 та 4 ), що охоплює масові оновлення (за допомогою однієї команди) в Entity Framework.
Незважаючи на те, що у центрі уваги цієї серії було оновлення, ви безумовно можете скористатися принципами видалення.
Отже, ви повинні мати можливість написати щось подібне:
var query = from c in ctx.Customers
where c.SalesPerson.Email == "..."
select c;
query.Delete();
Все, що вам потрібно зробити, це застосувати метод розширення Delete (). Дивіться серію публікацій, щоб дізнатись, як ...
Сподіваюся, це допомагає
using (var context = new DatabaseEntities())
{
// delete existing records
context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
}
Відповіді, які я бачу тут, - Linq to Sql
DeleteAllOnSubmit є частиною System.Data.Linq та ITable, яка є Linq to Sql
Цього не можна зробити за допомогою Entity Framework.
Сказавши все це, у мене ще немає рішення, але я відправлю повідомлення, коли знайду
Для тих, хто використовує EF6 і хоче виконати рядок SQL-запиту на видалення:
using (var context = new DatabaseEntities())
{
// delete existing records
context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}
RemoveRange був введений в EF6, він може видалити список об'єктів. Супер легко.
var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList();
db.PermitOrigins.RemoveRange(origins);
db.SaveChanges();
Я знаю метод DeleteAllOnSubmit будь-якого контексту даних, який видалить усі записи у запиті. Повинна бути якась оптимізація, оскільки багато об’єктів видаляються. Але я не впевнений.
Я не впевнений, наскільки це було б ефективно, але ви можете спробувати щось подібне:
// 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();
Ви можете написати збережений файл, який виконує видалення, і викликати його з LINQ. Видалення на основі набору, швидше за все, швидше, але якщо це впливає на занадто багато записів, це може спричинити проблеми із блокуванням, і вам може знадобитися гібрид циклу циклів записів (можливо, 2000 за раз, розмір залежить від дизайну вашої бази даних, але 2000 початкове місце, якщо ви виявите, що дельта на основі набору займає стільки часу, що це впливає на інше використання таблиці), щоб зробити видалення.
Видалення даних через 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();
У цьому прикладі я отримую записи для видалення, і я по черзі прикріплюю їх до набору результатів, а потім прошу їх видалити. Тоді я маю 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();
}
}
context.Entity.Where(p => p.col== id)
.ToList().ForEach(p => db.Entity.DeleteObject(p));
це найшвидший спосіб видалити запис із БД за допомогою EF
Я б зробив щось на зразок:
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, і більшу частину часу це означає колекцію об'єктів.