在 Windows Phone 上使用 Linq to SQL 时,是不是可以提高批量删除的性能?
Posted
技术标签:
【中文标题】在 Windows Phone 上使用 Linq to SQL 时,是不是可以提高批量删除的性能?【英文标题】:Is it possible to improve the performance of batch deletions when using Linq to SQL on Windows Phone?在 Windows Phone 上使用 Linq to SQL 时,是否可以提高批量删除的性能? 【发布时间】:2015-03-23 12:11:36 【问题描述】:我在 Windows Phone 应用程序中使用 Linq-to-SQL 在网络/Wi-Fi 覆盖范围外时充当缓存。这一切都很好,但我发现从缓存中删除过时的条目似乎使用了很多单独的单独语句。
考虑清除表的(相对简单的)情况(例如,如果最终用户选择注销):
context.CacheChecks.DeleteAllOnSubmit(context.CacheChecks);
您希望生成的 SQL 采用以下形式(或其他形式):
DELETE FROM CacheChecks
然而它变成了更类似于:
SELECT [t0].[LastChecked], [t0].[EntityType]
FROM [CacheChecks] AS [t0]
-- @p0: Input DateTime
-- (Size = 0; Prec = 0; Scale = 0) [3/13/2008 12:00:00 AM]
DELETE FROM [CacheChecks] WHERE [EntityType] = @p0
-- @p0: Input UniqueIdentifier (Size = 0; Prec = 0; Scale = 0) [GUID]
DELETE FROM [CacheChecks] WHERE [EntityType] = @p0
-- @p0: Input UniqueIdentifier (Size = 0; Prec = 0; Scale = 0) [GUID]
-- Individual DELETE statements for each row
在桌面上,我见过各种允许批量更新的扩展方法,似乎是based on this article by Terry Aney,但这种方法在 windows Phone 世界中不起作用,因为没有办法创建一个对于给定的上下文,任意的DbCommand
。
是否有另一种方法可以比逐行更有效地处理批量删除多行(1000 行)?
【问题讨论】:
我不熟悉 Windows Phone 开发,但我不知道如何截断表格?像context.ExecuteCommand("truncate table table_name");?
这样的东西在这里看到类似的问题:***.com/questions/1516962/…
和 Isarus 一样,但我在想context.Database.ExecuteSql("delete from table_name");
@Icarus 在 Windows Phone 上,该方法不存在 :(
@IronSlug 也没有通过 Windows Phone 数据上下文中的属性公开数据库
@Icarus 这就是我前几天发现的问题,这让我看到了 Terry 的博客文章 :)
【参考方案1】:
是的,可以执行绕过查询处理器的删除,在我的测试中将删除 100 行的时间从 320 毫秒缩短到 70 毫秒。你可以通过简单地向你的表中添加一个 rowversion 列来做到这一点:
[Column(IsVersion=true)]
private Binary _version;
更多信息在这里:http://erikej.blogspot.dk/2012/04/windows-phone-local-database-tip.html
【讨论】:
以上是关于在 Windows Phone 上使用 Linq to SQL 时,是不是可以提高批量删除的性能?的主要内容,如果未能解决你的问题,请参考以下文章