0

我正在使用 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 部分中使用?

4

1 回答 1

0

试试这个操作符
Byte.CompareTo(Byte),即使 this 显式转换,我们也必须开始研究 diff 方法的源代码art.Stanje.StanjeId.CompareTo(one) == 0

于 2013-09-27T08:38:55.847 回答