2009-05-15 47 views

Respuesta

23

para eliminar registros con Linq2Sql

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

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

Esta es una de las maneras más fáciles pero no diría que es la más eficiente. En realidad, no se está realizando ninguna optimización. El SQL generado enumera todos los objetos que coinciden con su consulta, y luego itera manualmente sobre ellos para eliminarlos. Ver este post - http://stackoverflow.com/questions/869209/bulk-deleting-via-linq – David

+0

Si no está utilizando LINQ to SQL, consulte http://stackoverflow.com/q/1781175/24267 – mhenry1384

+0

No se puede convertir implícitamente el tipo 'System.Linq.IQueryable ' en 'RajrangData.tblRelatedProduct'. Existe una conversión explícita (¿falta un molde? – rahularyansharma

1

quizá su Litle tarde a esta respuesta, pero hoy me encontré con esta demanda yo mismo y yo le ocurrió esta solución

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

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

ctx.SubmitChanges(); 
+4

Seguramente no puede afirmar haber 'aparecido' con esa solución cuando todo lo que hizo fue mover la declaración de 'cust' de la respuesta más popular al método 'DeleteAllOnSubmit'. – Sheridan

0

Estoy de acuerdo con Khurram, que es mucho más eficiente de hacer esto con un procedimiento almacenado sencilla con LINQ (siempre que tenga suficientes permisos en SQL para hacer esto). Aumentaré esto con un ejemplo.

El procedimiento almacenado:

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

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

Arrastre el procedimiento almacenado desde el explorador de la base de datos sobre los métodos de panel en su archivo DBML. Guarda el archivo. Y en el código:

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

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

Usando marco de la entidad 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

Extracción muchos registros basado en una sola cláusula where

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

Pero también se puede eliminar registros de la base de datos que no lo hacen existe en List<ListOfBadRecords>

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

Editar:

Sin saber cual es más rápido, pero se podía hacer la consulta con este segundo también

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

Edit2: no se olvide context.SaveChanges(); como lo hice en el primer borrador

0

Aquí es cómo resolví el problema:

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

Primero, usted puede encontrar una lista o f los elementos que desea eliminar.

Luego, puede usar la función RemoveRange(**list_of_item_to_delete**) para que elimine cada instancia en la lista presente en la base de datos.

De acuerdo con MSDN, el método elimina un rango de elementos de la lista.

Para obtener más información, consulte aquí https://msdn.microsoft.com/en-us/library/y33yd2b5(v=vs.110).aspx

+1

pls explica por qué funciona, no solo publique el código como respuesta –

0

Esto es lo que he usado, primero crea un objeto IEnumerable de la mesa donde están los registros que se deben eliminar son, a continuación, sólo tiene que utilizar removeRange, y, finalmente, acaba de guardar los cambios en base de datos. Supongamos que desea eliminar todos los productos de una ID de proveedor específica en la tabla Productos, así es como podría hacerlo.

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

Cuestiones relacionadas