我正在使用 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)
问题是生成的查询在查询的 where 列 StanjeId 的部分使用强制转换为 int,尽管 StanjeId 的类型是 tinyint(字节等效)。这导致 SQL SC 3.5 不使用索引查找,而是使用非常慢的表扫描(表有>1M
记录)。
如何让 EF 3.5 不在CAST as int
生成的 SQL 查询的 where 部分中使用?