Sé que esto es posible en LINQ-to-SQL, y he visto fragmentos que me llevan a creer que es posible en EF. ¿Hay una extensión por ahí que puede hacer algo como esto:Código de EF Primero, ¿Eliminar lote de IQueryable <T>?
var peopleQuery = Context.People.Where(p => p.Name == "Jim");
peopleQuery.DeleteBatch();
Dónde DeleteBatch
simplemente recoge además la peopleQuery y crea una única instrucción SQL para eliminar todos los registros apropiados, a continuación, ejecuta la consulta directamente en lugar de marcar todos aquellos entidades para su eliminación y tenerlas hacerlas una por una. Pensé que encontré algo así en el siguiente código, pero falla inmediatamente porque la instancia no se puede convertir en ObjectSet. ¿Alguien sabe cómo arreglar esto para trabajar con EF Code First? ¿O sabe de algún lugar que tenga un ejemplo de esto?
public static IQueryable<T> DeleteBatch<T>(this IQueryable<T> instance) where T : class
{
ObjectSet<T> query = instance as ObjectSet<T>;
ObjectContext context = query.Context;
string sqlClause = GetClause<T>(instance);
context.ExecuteStoreCommand("DELETE {0}", sqlClause);
return instance;
}
public static string GetClause<T>(this IQueryable<T> clause) where T : class
{
string snippet = "FROM [dbo].[";
string sql = ((ObjectQuery<T>)clause).ToTraceString();
string sqlFirstPart = sql.Substring(sql.IndexOf(snippet));
sqlFirstPart = sqlFirstPart.Replace("AS [Extent1]", "");
sqlFirstPart = sqlFirstPart.Replace("[Extent1].", "");
return sqlFirstPart;
}
Estoy de acuerdo con usted al 100% en todos sus puntos, pero es un riesgo aceptable en nuestro proyecto teniendo en cuenta el golpe de rendimiento serio que se tomó al hacerlo de manera oficial. ¡Gracias por la respuesta! – Ocelot20