¿Hay alguna forma de eliminar de forma masiva un grupo de objetos que coincidan con una consulta determinada en LINQ o LINQ-to-Entities? Las únicas referencias que puedo encontrar están desactualizadas, y parece tonto iterar y eliminar manualmente todos los objetos que deseo eliminar.Supresión masiva en LINQ a entidades
Respuesta
La pregunta es anterior (antes de que EF5 existiera). Para cualquiera que esté usando EF5, EntityFramework.Extended hace esto en un instante.
Conozco el método DeleteAllOnSubmit de cualquier contexto de datos que eliminará todos los registros en la consulta. Debe haber cierta optimización subyacente ya que muchos objetos se están eliminando. No estoy seguro sin embargo.
Realmente no se realiza ninguna optimización. El SQL generado enumera todos los objetos que coinciden con su consulta, y luego itera manualmente sobre ellos para eliminarlos. Por supuesto, la iteración ocurre en el DB, en lugar de en tu código, pero aún estás construyendo innecesariamente un conjunto de resultados simplemente para eliminar su contenido, todavía mucho peor que un simple "ELIMINAR DE la tabla DONDE foo = barra", que construye no hay conjunto de resultados y cubre la tabla solo una vez. –
no estoy seguro de qué tan eficiente que sería, pero usted podría intentar algo como esto:
// 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();
Eso aún termina iterando sobre todos los elementos que coinciden con la consulta; simplemente lo hace en la base de datos, en lugar de hacerlo en tu código. Más eficiente, pero aún lejos de ser una solución ideal. –
La única otra manera que podría pensar para hacerlo, entonces, sería hacer myDataContext.ExecuteCommand ("DELETE ...") ;. Lejos de ideal, también, pero funcionaría. –
Se puede escribir un procedimiento almacenado que realiza el borrado y llamarlo desde LINQ. En general, una eliminación basada en conjunto es más rápida, pero si afecta a demasiados registros podría causar problemas de bloqueo y es posible que necesite un híbrido de bucles a través de conjuntos de registros (tal vez 2000 a la vez, el tamaño depende del diseño de su base de datos pero 2000 es lugar de inicio si considera que el delte basado en conjunto tarda tanto en afectar el uso de la tabla) para realizar la eliminación.
Hace un tiempo escribí una serie de blog de 4 partes (partes 1, 2, 3 y 4) que cubren haciendo actualizaciones masivas (con un comando) en el marco de la entidad.
Si bien el foco de esa serie era la actualización, definitivamente podría usar los principios implicados para hacer la eliminación.
Por lo que debe ser capaz de escribir algo como esto:
var query = from c in ctx.Customers
where c.SalesPerson.Email == "..."
select c;
query.Delete();
Todo lo que necesita hacer es poner en práctica el método de extensión de eliminación(). Ver la línea de postes en busca de pistas sobre cómo ...
Esperanza esto ayuda
Excelente serie. Escribir un método de extensión Delete() basado en esto será trivial. –
Sería bueno tener una muestra de código aquí si alguien lo tiene. – jocull
Puede encontrar una gran cantidad de métodos de extensión (incluida una eliminación por lotes) aquí: https://github.com/loresoft/EntityFramework.Extended – Soliah
Las respuestas que estoy viendo aquí son LINQ to SQL
DeleteAllOnSubmit es parte de System.Data.Linq y que es ITable Linq a Sql
Esto no se puede hacer con Entity Framework.
Habiendo dicho todo eso no tengo una solución, pero todavía volver a publicar cuando lo haga
using (var context = new DatabaseEntities())
{
// delete existing records
context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
}
+1 - Es bueno ver un ejemplo de código de cómo ejecutar el código SQL usando EF –
Me doy cuenta de que esta es probablemente la única forma de hacer esto, salvo crear un procedimiento almacenado, pero parece una trampa =). Ahora que estoy usando esto, me siento tentado de usarlo en varios otros lugares para cicumvent la extravagancia de EF, como las complejas combinaciones de la izquierda y bys del grupo ... :) – Losbear
+! ... cuando se usa una base de datos , encontrarás que la herramienta que deseas es un destornillador. EF es solo otro martillo. – gbjbaanb
Eliminación de datos a través del marco de la entidad se basa en el uso del método DeleteObject. Puede invocar este método en EntityCollection para la clase de entidad que desea eliminar o en ObjectContext derivado. Aquí hay un ejemplo 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();
Sin embargo, eso no es "Bulk Delete". – Nuzzolilo
Para aquellos que utilizan EF6 y quieren ejecutar fila consulta SQL para su eliminación:
using (var context = new DatabaseEntities())
{
// delete existing records
context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}
Esto funcionó para mí en EF 5 pero tuve que usar @ p0 para el parámetro.Lo bueno es que proporciona param type seguro de comprobar en el SQL generado: por lo que en EF5, esto funcionaría: context.Database.ExecuteSqlCommand ("BORRADO DE YourTable DONDE CustomerID = @ P0", idParameter); \ @ P1 para el próximo parámetro, etc ... –
me gustaría hacer algo como:
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();
}
}
No creo que hay una manera de hazlo sin un bucle ya que Entity Framework funciona con Entidades y la mayoría de las veces, esto significa colección de objetos.
En este ejemplo, obtengo los registros para eliminar, y uno a uno los adjunta al conjunto de resultados y luego solicito que se eliminen. Entonces tengo 1 guardar cambios.
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));
ellos es el método más rápido para eliminar el registro de la base de datos usando EF
removeRange se introdujo en EF6, se puede eliminar una lista de objetos. Muy facil.
var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList();
db.PermitOrigins.RemoveRange(origins);
db.SaveChanges();
Mientras que este fragmento de código puede resolver la cuestión, [incluyendo una explicación] (http: //meta.stackexchange .com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – DimaSan
- 1. Cómo hacer una inserción masiva - Linq a las entidades
- 2. LINQ a Entidades EF4
- 3. Linq a Entidades con WCF
- 4. Linq a entidades: Uniones + Distintas
- 5. Linq a Entidades Cláusula Distintiva
- 6. LINQ a las entidades Únete en DateTime.DayOfWeek
- 7. Agregue una fecha en Linq a entidades
- 8. combinación interna en LINQ a las entidades
- 9. include() en LINQ a Entidades consultar
- 10. condicional incluir en linq a las entidades?
- 11. linq a entidades vs linq a objetos - ¿son lo mismo?
- 12. LINQ a Entidades no admite invocación
- 13. LINQ a entidades para restar 2 fechas
- 14. Linq a entidades y propiedades concatenas
- 15. Linq a Entidades Skip() y Take()
- 16. LINQ a las entidades y Lazy Loading
- 17. LINQ a Entidades - carga ansiosos usando include()
- 18. de carga con LINQ a Entidades
- 19. igual que con LINQ a Entidades
- 20. linq a las entidades generadas sql
- 21. OrdenarPor y distinto utilizando entidades LINQ-a-
- 22. Distintos meses-año con Linq (a entidades)
- 23. LINQ a Entidades con método AddMonth
- 24. Rendimiento de Linq a Entidades vs ESQL
- 25. LINQ a Entidades no SqlFunctions.DateDiff apoyado
- 26. Muchos a muchos seleccionar en LINQ a Entidades
- 27. inserción masiva con linq-to-sql
- 28. Actualización masiva con LINQ to SQL
- 29. Entidades Linq 2 SQL o Linq
- 30. Método de extensión en where cláusula en linq a Entidades
Gracias. He actualizado esta para ser la respuesta aceptada. –
EF 6 'RemoveRange' http://stackoverflow.com/a/21468165/1876572 – Eldho