No dejes de divulgar nuestros tutoriales y códigos en tus redes, apóyanos para ampliar esta comunidad.
Solución:
Podría ejecutar un comando normal de SQL truncado o eliminado, usando el método DataContext.ExecuteCommand:
context.ExecuteCommand("DELETE FROM Entity");
O
context.ExecuteCommand("TRUNCATE TABLE Entity");
La forma en que está eliminando lleva mucho tiempo porque Linq to SQL genera una instrucción DELETE para cada entidadHay otros tipo seguro enfoques para realizar eliminaciones/actualizaciones por lotes, consulte los siguientes artículos:
- Actualizaciones y eliminaciones por lotes con LINQ to SQL
- Extensión de LINQ to SQL: Eliminación por lotes con expresión Lambda
Desafortunadamente, LINQ-to-SQL no ejecuta muy bien las consultas basadas en conjuntos.
Asumirías que
context.Entities.DeleteAllOnSubmit(context.Entities);
context.SubmitChanges();
se traducirá a algo como
DELETE FROM [Entities]
pero desafortunadamente es más como
DELETE FROM [dbo].[Entities] WHERE ([EntitiesId] = @p0) AND ([Column1] = @p1) ...
DELETE FROM [dbo].[Entities] WHERE ([EntitiesId] = @p0) AND ([Column1] = @p1) ...
DELETE FROM [dbo].[Entities] WHERE ([EntitiesId] = @p0) AND ([Column1] = @p1) ...
Encontrará lo mismo cuando intente realizar una actualización masiva en LINQ-to-SQL. Más de unos pocos cientos de filas a la vez y simplemente será demasiado lento.
Si necesita realizar operaciones por lotes y está utilizando LINQ-to-SQL, debe escribir procedimientos almacenados.
Me gusta usar un método de extensión, según lo siguiente:
public static class LinqExtension
public static void Truncate(this Table table) where TEntity : class
var rowType = table.GetType().GetGenericArguments()[0];
var tableName = table.Context.Mapping.GetTable(rowType).TableName;
var sqlCommand = String.Format("TRUNCATE TABLE 0", tableName);
table.Context.ExecuteCommand(sqlCommand);