在 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 时,是不是可以提高批量删除的性能?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 Linq to SQL 的情况下在 Windows Phone 中使用 SQL Server Compact
BackgroundWorker UI不会更新Windows Phone 7中的进度
Windows Forms 应用程序用于访问 Windows Phone 中的 SQL Server CE 数据库的连接字符串