简体   繁体   English

实体框架3.5 + SQL Server Compact 3.5,由于强制转换性能较慢

[英]Entity Framework 3.5 + SQL Server Compact 3.5, slow performace because of cast

I'm using VS2008, .NET 3,5, Entity Framework 3.5, Sql Server Compact 3.5 SP2. 我正在使用VS2008,.NET 3.5,实体框架3.5,Sql Server Compact 3.5 SP2。 SQL SC 3.5 is accessed using EF, with Database first approach. 使用数据库优先方法使用EF访问SQL SC 3.5。

I'm using a simple query (linq and EF) that should use an existing compound index for columns StanjeId (tinyint) and ArtiklId (int). 我正在使用一个简单的查询(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);

The generated query using (compQuery2 as System.Data.Objects.ObjectQuery).ToTraceString() is: 使用(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)

The problem is that the generated query uses cast to int in the where part of the query for column StanjeId although StanjeId is of type tinyint (byte equivalent). 问题在于,尽管StanjeId的类型为tinyint(等效字节),但生成的查询在列StanjeId的查询的where部分中使用强制转换为int。 That causes the SQL SC 3.5 not to use index seek, but a very slow table scan (table has >1M records). 这将导致SQL SC 3.5不使用索引查找,而是使用非常慢的表扫描(表具有>1M条记录)。

How to get EF 3.5 to not use CAST as int in the where part the generated SQL query? 如何使EF 3.5在生成的SQL查询的何处不将CAST as int

try this operator 试试这个运算符
Byte.CompareTo(Byte) , art.Stanje.StanjeId.CompareTo(one) == 0 , Byte.CompareTo(Byte)art.Stanje.StanjeId.CompareTo(one) == 0
even if this explicitly casts , we will have to start looking into source code for diff methods. 即使这明确地进行了强制转换,我们也必须开始研究diff方法的源代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM