web-dev-qa-db-fra.com

Le meilleur moyen de supprimer plusieurs enregistrements dans une requête LINQ?

Quel est le meilleur moyen de supprimer plusieurs enregistrements en une fois avec LINQ?

20
Yogs...

Pour supprimer des enregistrements avec Linq2Sql

 CustomerDataContext ctx = new CustomerDataContext ("chaîne de connexion"); 
 Var clients = ctx.Customers.Where (c => c.Name == "david"); 
 
 ctx.Customers.DeleteAllOnSubmit (clients); 
 ctx.SubmitChanges (); 
24
David

Suppression de nombreux enregistrements en fonction d'une seule clause Where

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

Mais vous pouvez aussi Supprimer des enregistrements de la base de données qui n'existent pas dans List<ListOfBadRecords>

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

Modifier:

Vous ne savez pas ce qui est plus rapide, mais vous pouvez aussi faire la deuxième requête avec ceci

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

Edit2: ne pas oublier context.SaveChanges(); comme je l'ai fait dans le premier brouillon

2
Don Thomas Boyle

Les bons vieux SPROC .....

Vous pouvez faire glisser le SPROC vers votre fichier DBML pour générer une méthode riche dans votre classe databasecontext.

2
Khurram Aziz

Utilisation du framework d'entité 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
Asad Malik

Ce qui suit est plus pour LINQ to Entities, mais cela peut aider:

Suppression en masse dans LINQ to Entities

2
Jagd

Voici comment j'ai résolu le problème:

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

Tout d'abord, vous pouvez trouver une liste des éléments que vous souhaitez supprimer.

Ensuite, vous pouvez utiliser la fonction RemoveRange(**list_of_item_to_delete**) pour supprimer chaque instance de la liste présente dans la base de données.

Selon le MSDN, la méthode supprime une plage d'éléments de la liste.

Pour plus d'informations, consultez la page https://msdn.Microsoft.com/en-us/library/y33yd2b5(v=vs.110).aspx

1
Pedro Henrique

peut-être qu'il est un peu tard pour cette réponse, mais aujourd'hui, je me suis heurté à cette demande moi-même et j'ai trouvé cette solution

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

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

ctx.SubmitChanges();
1
Jonuz

C’est ce que j’ai utilisé. Commencez par créer un objet IENumerable de la table où se trouvent les enregistrements à supprimer, puis utilisez simplement RemoveRange et, enfin, sauvegardez les modifications apportées à la base de données. Supposons que vous souhaitiez supprimer tous les produits d'un ID de fournisseur spécifique dans la table Produits. Voici comment procéder.

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

0
Cesar Duran

Je suis d'accord avec Khurram, il est beaucoup plus efficace de le faire avec une procédure stockée simple avec LINQ (à condition que vous disposiez des autorisations suffisantes dans SQL pour le faire). Je vais augmenter cela avec un exemple.

La procédure stockée:

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

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

Faites glisser la procédure stockée à partir de l'explorateur de base de données dans le volet des méthodes de votre fichier DBML. Enregistrez le fichier. Et en code:

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

    SETSDataContext context = new SETSDataContext();
    context.RemovePermissionsFromRole(roleID);
}
0
Brandon Ward