实体框架3.5 + SQL Server Compact 3.5,因为强制转换性能低下

时间:2013-09-27 06:52:51

标签: c# .net entity-framework sql-server-ce-3.5

我正在使用VS2008,.NET 3,5,Entity Framework 3.5,Sql Server Compact 3.5 SP2。使用EF访问SQL SC 3.5,使用数据库第一种方法。

我正在使用一个简单的查询(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查询的where部分不使用CAST as int

1 个答案:

答案 0 :(得分:0)

尝试此操作符
Byte.CompareTo(Byte)art.Stanje.StanjeId.CompareTo(one) == 0,即使显式转换,我们也必须开始查看diff方法的源代码。