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); } }