簡體   English   中英

實體框架3.5 + SQL Server Compact 3.5,由於強制轉換性能較慢

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

我正在使用VS2008,.NET 3.5,實體框架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的類型為tinyint(等效字節),但生成的查詢在列StanjeId的查詢的where部分中使用強制轉換為int。 這將導致SQL SC 3.5不使用索引查找,而是使用非常慢的表掃描(表具有>1M條記錄)。

如何使EF 3.5在生成的SQL查詢的何處不將CAST as int

試試這個運算符
Byte.CompareTo(Byte)art.Stanje.StanjeId.CompareTo(one) == 0
即使這明確地進行了強制轉換,我們也必須開始研究diff方法的源代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM