【发布时间】:2012-06-04 10:44:33
【问题描述】:
编辑:我已经阅读了有关该主题的更多内容,并意识到contrary to what is suggested,我只是将我为桌面应用程序生成的同一个 .sdf 文件包含在移动应用程序中。由于桌面/移动设备之间的索引格式似乎不同(我已经阅读了有关第一个数据库连接的警告,因为如果这样做会重建索引,则需要更长的时间here)并且我从安装文件夹中以只读方式打开数据库,是不是引擎完全忽略了我的索引,因为它无法转换它们?
我有一个带有单个表 Entities 的 SQL Server CE 3.5 数据库,它有大约 146,000 行和这些列:Id (int, primary key), Gloss (nvarchar(4000)), GlossLen (int), Meaning (nvarchar(4000),以及 Gloss 和 Glosslen 上的索引。这由我正在为 Windows (WPF) 和 WP7.5 开发的跨平台应用程序使用。
然后我使用 LINQ to SQL 对数据库运行以下查询:
(from d in Entities
where d.Gloss.StartsWith("searchstring")
orderby d.GlossLen ascending
select new
{ Id = d.Id, WrittenForms = d.Gloss, MeaningsString = d.Meaning,
MatchString = d.Gloss, MatchStringLen = d.GlossLen }).Take(200)
现在面临的问题是,虽然查询在 Windows 中以合理的速度(2 秒或更短)执行,但在实际的 WP7 设备上它变得非常慢(6 秒以上)(模拟器几乎和WPF)。
据我所知,生成的 SQL 似乎是合理的:下面是 LINQPad 返回的内容。
SELECT TOP (200)
[t0].[Id], [t0].[Gloss] AS [WrittenForms], [t0].[Meaning] AS [MeaningsString],
[t0].[GlossLen] AS [MatchStringLen]
FROM [Entities] AS [t0]
WHERE [t0].[Gloss] LIKE @p0
ORDER BY [t0].[GlossLen]
Visual Studio 报告的查询执行计划是:Index Seek->Filter->Sort->Select,所以我没有进行表扫描。
我也已经尝试在 LINQ 查询上使用CompiledQuery.Compile,存储生成的 Func 以供重复使用,但没有看到任何改进。
我做错了什么? WP7 和 WPF 代码路径的唯一区别是 WP7 数据库是以只读方式从安装文件夹打开的。
【问题讨论】:
-
不,如果索引需要重建,你会得到一个错误。索引问题与 Windows Mobile 相关,而不是 Phone
标签: windows-phone-7 linq-to-sql sql-server-ce