2009-05-15 3 views
17

Каков наилучший способ удалить несколько записей за один раз с помощью LINQ?Лучший способ удалить несколько записей в запросе LINQ?

+1

Если вам нужно сделать что-то вроде 'DELETE FROM table WHERE ...', тогда рассмотрим использование SQL. LINQ не может быть лучшим инструментом для этой работы. – Myster

ответ

23

Для удаления записей с Linq2Sql

 
CustomerDataContext ctx = new CustomerDataContext("connection string"); 
var customers = ctx.Customers.Where(c => c.Name == "david"); 

ctx.Customers.DeleteAllOnSubmit(customers); 
ctx.SubmitChanges(); 
+3

Это один из самых простых способов, но я бы не сказал, что это самый эффективный способ. На самом деле оптимизация не выполняется. Сгенерированный SQL перечисляет все объекты, соответствующие вашему запросу, а затем вручную перебирает их, чтобы удалить их. Просмотреть это сообщение - http://stackoverflow.com/questions/869209/bulk-deleting-via-linq – David

+0

Если вы не используете LINQ to SQL, см. Http://stackoverflow.com/q/1781175/24267 – mhenry1384

+0

Невозможно неявно преобразовать тип «System.Linq.IQueryable » в «RajrangData.tblRelatedProduct». Явное преобразование существует (вы пропускаете листинг? – rahularyansharma

1

может быть, его Лил поздно этого ответа, но сегодня я столкнулся с этим требую сам я, и я пришел с этим решением

CustomerDataContext ctx = new CustomerDataContext("connection string"); 

ctx.Customers.DeleteAllOnSubmit(ctx.Customers.Where(c => c.Name == "david")); 

ctx.SubmitChanges(); 
+4

Несомненно, вы не можете претендовать на то, чтобы« придумать »это решение когда все, что вы делали, переместило объявление 'cust' из самого популярного ответа на метод' DeleteAllOnSubmit'. – Sheridan

0

Я согласен с Куррамом, это гораздо эффективнее сделать это с помощью простой хранимой процедуры с LINQ (если у вас есть достаточные разрешения для SQL). Я приведу пример с примером.

Хранимая процедура:

CREATE PROCEDURE [dbo].[RemovePermissionsFromRole] 
(
    @ROLE_ID int 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DELETE FROM [RolePermissions] WHERE [RoleID] = @ROLE_ID; 
END 

Перетащите хранимую процедуру из проводника баз данных на методах панели в файле DBML. Сохраните файл. А в коде:

if (Request.QueryString["RoleID"] != null) { 
    int roleID = Convert.ToInt32(Request.QueryString["RoleID"]); 

    SETSDataContext context = new SETSDataContext(); 
    context.RemovePermissionsFromRole(roleID); 
} 
1

Использование рамки сущности 6

// Database context 
EntitiesContext db = new EntitiesContext(connString); 
// Select all the records to be deleted 
IEnumerable<entity> list = db.entity.where(x=>x.id == id).toList(); 
// Use Remove Range function to delete all records at once 
db.entity.RemoveRange(list); 
// Save changes 
db.SaveChanges(); 
2

Удаление много записей на основе одного, где положение

context.EntityModel 
      .RemoveAll(r => r.property == "propertyEntered"); 

Но вы можете также удалить записи из базы данных, которые не существуют в List<ListOfBadRecords>

context.EntityModel 
      .Where(w => w.propertyID == ID).ToList() 
      .RemoveAll(r => !ListOfBadRecords.Any(a => a.anyID == r.propertyID)); 

Edit:

Неуверенный которым быстрее, но вы могли бы сделать 2-й запрос с этим также

.RemoveAll(r => !ListOfBadRecords.Select(s=>s.propertyID).Contains(w.propertyID))

Edit2: не забудьте context.SaveChanges();, как я сделал в первом проекте

0

Здесь как я решил проблему:

 try 
     { 
      List<MaterialPartSerialNumber> list = db.MaterialPartSerialNumbers.Where(s => s.PartId == PartId && s.InventoryLocationId == NewInventoryLocationId && s.LocationId == LocationId).ToList(); 
      db.MaterialPartSerialNumbers.RemoveRange(list); 
      db.SaveChanges(); 
     } 
     catch(Exception ex) 
     { 
      string error = ex.Message; 
     } 

Во-первых, вы можете найти список o f элементы, которые вы хотите удалить.

Затем вы можете использовать функцию RemoveRange(**list_of_item_to_delete**), чтобы удалить каждый экземпляр из списка, присутствующего в базе данных.

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

Для получения дополнительной информации, проверить его здесь https://msdn.microsoft.com/en-us/library/y33yd2b5(v=vs.110).aspx

+1

PLS объясняет, почему он работает, а не просто отправьте код как ответ –

0

Это то, что я использовал, сначала создать IEnumerable объект таблицы, где находятся записи, которые должны быть удалены являются, а затем просто использовать RemoveRange, и, наконец, просто сохраните изменения база данных. Предположим, вы хотите удалить все продукты из одного идентификатора поставщика в таблице Products, так вы можете это сделать.

IEnumerable ProductsToRemove = db.Products.Where (x => x.SupplierId == Supplierid); db.Products.RemoveRange (ProductsToRemove); db.SaveChanges();

Смежные вопросы