Linq to Sql:如何快速清除表格

Svi*_*ish 84 c# linq-to-sql delete-row

要删除表中的所有行,我目前正在执行以下操作:

context.Entities.DeleteAllOnSubmit(context.Entities);
context.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)

然而,这似乎需要很长时间.有更快的方法吗?

CMS*_*CMS 120

您可以使用DataContext.ExecuteCommand方法执行正常的SQL truncate或delete命令:

context.ExecuteCommand("DELETE FROM Entity");
Run Code Online (Sandbox Code Playgroud)

要么

context.ExecuteCommand("TRUNCATE TABLE Entity");
Run Code Online (Sandbox Code Playgroud)

要删除正在长,因为LINQ到SQL生成DELETE语句的方式每个实体,还有其他类型安全的方式做批量删除/更新,请检查下面的文章:

  • 我为此+1了.这是一个参考,解释了Truncate(我认为你想做)和删除之间的区别:http://www.mssqltips.com/tip.asp?tt = 1080 (9认同)

Kir*_*rst 20

不幸的是,LINQ-to-SQL不能很好地执行基于集合的查询.

你会认为

context.Entities.DeleteAllOnSubmit(context.Entities); 
context.SubmitChanges(); 
Run Code Online (Sandbox Code Playgroud)

会翻译成类似的东西

DELETE FROM [Entities]
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它更像是

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) ...
Run Code Online (Sandbox Code Playgroud)

当您尝试在LINQ-to-SQL中进行批量更新时,您会发现相同的内容.一次超过几百行,它只是太慢了.

如果您需要进行批处理操作并且使用LINQ-to-SQL,则需要编写存储过程.


fla*_*Zer 11

我喜欢使用扩展方法,具体如下:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)