Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架3.5+;SQL Server Compact 3.5,由于强制转换,性能较慢_C#_.net_Entity Framework_Sql Server Ce 3.5 - Fatal编程技术网

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

C# 实体框架3.5+;SQL Server Compact 3.5,由于强制转换,性能较慢,c#,.net,entity-framework,sql-server-ce-3.5,C#,.net,Entity Framework,Sql Server Ce 3.5,我使用的是VS2008、.NET3,5、EntityFramework 3.5、SQLServerCompact 3.5SP2。SQL SC 3.5使用EF访问,采用数据库优先的方法 我使用的是一个简单的查询(linq和EF),它应该为列StanjeId(tinyint)和ArtiklId(int)使用现有的复合索引 使用(compQuery2作为System.Data.Objects.ObjectQuery).ToTraceString()生成的查询是: SELECT 1 AS [C1],

我使用的是VS2008、.NET3,5、EntityFramework 3.5、SQLServerCompact 3.5SP2。SQL SC 3.5使用EF访问,采用数据库优先的方法

我使用的是一个简单的查询(linq和EF),它应该为列StanjeId(tinyint)和ArtiklId(int)使用现有的复合索引

使用
(compQuery2作为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在生成的SQL查询的where部分中不使用强制转换为int?

尝试此运算符
Byte.CompareTo(Byte)
art.Stanje.StanjeId.CompareTo(one)==0

,即使这显式强制转换,我们必须开始研究不同方法的源代码。

您使用了分配给1的
byte
变量,
byte one=1
,而不是
(byte)1
?生成的查询的一部分现在在哪里:WHERE((CAST([Extent1].[StanjeId]AS int))=(CAST(@p_ulinq_u3 AS int))和([Extent1].[ArtiklId]=@p_ulinq_4)So通常是相同的,但现在StanjeId列和变量one都被分别强制转换为int。请尝试使用此运算符
Byte.CompareTo(Byte)
art.Stanje.StanjeId.CompareTo(one)==0,即使它显式强制转换,我们必须开始研究diff方法的源代码(谢谢Rameez:)您的解决方案工作得很好,并且从生成的SQL查询中删除了强制转换。为什么art.Stanje.StanjeId==(字节)1生成的代码与art.Stanje.StanjeId.CompareTo(一)==0不同,尽管逻辑上应该是相同的?发布下面的答案,因为它可能会帮助其他人,逻辑上许多东西在C#中看起来是相同的,但当我们查看源代码或ILDASM时,我们意识到了差异。但是你的问题比我的回答重要得多:)谢谢
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)