Linq to Sql:如何快速清理表格
要删除表中的所有行,我正在执行以下操作:
context.Entities.DeleteAllOnSubmit(context.Entities); context.SubmitChanges();
但是,这似乎需要很长时间。 有更快的方法吗?
您可以使用DataContext.ExecuteCommand方法执行正常的SQL截断或删除命令:
context.ExecuteCommand("DELETE FROM Entity");
要么
context.ExecuteCommand("TRUNCATE TABLE Entity");
由于Linq to SQL为每个实体生成一个DELETE语句,所以你要删除的方式需要花费很长时间,还有其他types安全的方法来执行批量删除/更新,请检查以下文章:
- 批量更新和删除与LINQ to SQL
- LINQ to SQL扩展:使用Lambdaexpression式批量删除
不幸的是,LINQ-to-SQL不能很好地执行基于集合的查询。
你会假设的
context.Entities.DeleteAllOnSubmit(context.Entities); context.SubmitChanges();
会翻译成类似的东西
DELETE FROM [Entities]
但不幸的是它更像
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) ...
当您尝试在LINQ-to-SQL中执行批量更新时,您会发现相同。 每次超过几百行,这太简单了。
如果您需要执行批处理操作,并且您正在使用LINQ-to-SQL,则需要编写存储过程。
我喜欢使用扩展方法,按照以下内容:
public static class LinqExtension { public static void Truncate<TEntity>(this Table<TEntity> 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); } }