实体框架 3.5 + SQL Server Compact 3.5,由于强制转换,性能降低
本文关键字:于强制 转换 性能 Compact 框架 SQL Server 实体 | 更新日期: 2023-09-27 18:32:56
我正在使用VS2008,.NET 3,5,Entity Framework 3.5,Sql Server Compact 3.5 SP2。SQL SC 3.5 使用 EF 访问,采用数据库优先方法。
我正在使用一个简单的查询(linq 和 EF),它应该对列 StanjeId (tinyint) 和 ArtiklId (int) 使用现有的复合索引。
var compQuery2 = from art in MobileDb.Artikl
where art.Stanje.StanjeId == (byte)1
&& art.ArtiklId == tmp1
select art;
var quer1 = MobileDb.Artikl.Where(a => a.Stanje.StanjeId == (byte)1 && a.ArtiklId == tmp1);
使用 (compQuery2 as System.Data.Objects.ObjectQuery).ToTraceString()
生成的查询为:
SELECT
1 AS [C1],
[Extent1].[ArtiklGuid] AS [ArtiklGuid],
.
.
[Extent1].[StanjeId] AS [StanjeId],
[Extent1].[ZemljaPorijeklaDrzavaGuid] AS [ZemljaPorijeklaDrzavaGuid]
FROM [Artikl] AS [Extent1]
WHERE (1 = ( CAST( [Extent1].[StanjeId] AS int))) AND ([Extent1].[ArtiklId] = @p__linq__4)
问题是生成的查询在列 StanjeId 查询的 where 部分中使用 cast to int,尽管 StanjeId 的类型为 tinyint(字节等效)。这会导致 SQL SC 3.5 不使用索引查找,而是使用非常慢的表扫描(表包含 >1M
条记录)。
如何让EF 3.5在生成的SQL查询的位置部分不使用CAST as int
?
试试这个运算符Byte.CompareTo(Byte)
,art.Stanje.StanjeId.CompareTo(one) == 0
,
即使它显式强制转换,我们也将不得不开始研究diff方法的源代码。