Existe-t-il un moyen de supprimer en bloc un groupe d'objets correspondant à une requête donnée dans LINQ ou LINQ-to-Entities? Les seules références que je peux trouver sont obsolètes, et il semble ridicule de parcourir et de supprimer manuellement tous les objets que je souhaite supprimer.
La question est ancienne (d’avant la création de EF5). Pour ceux qui utilisent EF5, EntityFramework.Extended le fait en un clin d'œil.
Il y a quelque temps, j'ai écrit une série de blogues en 4 parties (Parts 1 , 2 , 3 et 4 ) couvrant les mises à jour groupées (avec une seule commande) dans Entity Framework.
Bien que l’objectif de cette série ait été de mettre à jour, vous pouvez certainement utiliser les principes impliqués pour supprimer.
Vous devriez donc pouvoir écrire quelque chose comme ceci:
var query = from c in ctx.Customers
where c.SalesPerson.Email == "..."
select c;
query.Delete();
Tout ce que vous avez à faire est d'implémenter la méthode d'extension Delete (). Voir la série d'articles pour des astuces sur la façon de ...
J'espère que cela t'aides
using (var context = new DatabaseEntities())
{
// delete existing records
context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
}
Les réponses que je vois ici sont Linq to SQL
DeleteAllOnSubmit fait partie de System.Data.Linq et ITable, qui correspond à Linq to Sql
Cela ne peut pas être fait avec Entity Framework.
Ayant dit tout cela, je n'ai pas encore de solution mais je posterai quand je le ferai.
Pour ceux qui utilisent EF6 et souhaitent exécuter une requête SQL de ligne pour suppression:
using (var context = new DatabaseEntities())
{
// delete existing records
context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}
Je sais de DeleteAllOnSubmit méthode de tout contexte de données qui supprimera tous les enregistrements de la requête. Il doit y avoir une optimisation sous-jacente car de nombreux objets sont en cours de suppression. Je ne suis pas sûr cependant.
Je ne suis pas sûr de son efficacité, mais vous pouvez essayer quelque chose comme ceci:
// 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();
Je ferais quelque chose comme:
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();
}
}
Je ne pense pas qu'il soit possible de le faire sans boucle puisque Entity Framework fonctionne avec des entités et que, la plupart du temps, cela signifie une collection d'objets.
Vous pourriez écrire un proc stocké qui effectue la suppression et l'appeler depuis LINQ. Une suppression basée sur un ensemble est probablement plus rapide dans l'ensemble, mais si elle affecte trop d'enregistrements, vous risquez de provoquer des problèmes de verrouillage et vous aurez peut-être besoin d'une combinaison hybride de séquences d'enregistrements (peut-être 2000 à la fois. point de départ si vous trouvez que la suppression basée sur un jeu prend tellement de temps qu’elle affecte l’utilisation ultérieure de la table) pour effectuer la suppression.
Dans cet exemple, je reçois les enregistrements à supprimer et les attache un par un au jeu de résultats, puis demande leur suppression. Ensuite, j'ai 1 sauvegarde des modifications.
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();
}
}
La suppression de données via Entity Framework repose sur l'utilisation de la méthode DeleteObject. Vous pouvez appeler cette méthode sur EntityCollection pour la classe d'entité à supprimer ou sur l'ObjectContext dérivé. Voici un exemple simple:
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();
context.Entity.Where(p => p.col== id)
.ToList().ForEach(p => db.Entity.DeleteObject(p));
c'est la méthode la plus rapide pour supprimer un enregistrement de la base de données en utilisant EF
RemoveRange a été introduit dans EF6, il peut supprimer une liste d'objets. Super facile.
var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList();
db.PermitOrigins.RemoveRange(origins);
db.SaveChanges();