Entity Framework生成"CAST AS int"SQL語句的問題


在Entity Framework生成的SQL語句中,你是否留意過CAST的倩影:

(0 =  CAST( [Extent1].[LockFlag] AS int))

她不是那么引人注目,她不是那么讓人一眼心動,但是她值得留意,因為她與眾不同...

之前見過多次,今天特別留意,並放在了博問中,以吸引更多人的注意,同時也加深自己的注意。

原本期望的SQL語句是:

[Extent1].[LockFlag] = 0

現在多了個CAST。多了個CAST有什么關系呢?它會使得這樣的SQL查詢不會使用建立在LockFlag上的索引(由於是smallint列,多數情況下不用索引影響也不大)。

今天,在好奇心的驅使下,我想知道為什么會出現這個問題?在博問中提出問題之后,終於找到了答案。

(感悟:將問題通過文字清晰地表達出來,問題就解決了一半)

LockFlag在數據庫定義的類型是smallint,所以在定義實體類時,理所當然地用short(或int16)。

但是 Entity Framework 的想法卻與眾不同,它只要遇到short(或int16)類型,就會生成CAST轉換為int進行查詢。

解決方法:

將short(或int16)類型改為int類型。

該解決方法存在問題,在where查詢中符合要求,但在映射時出現錯誤:

System.InvalidOperationException : The 'LockFlag' property on 'Article' could not be set to a 'Int16' value. You must set this property to a non-null value of type 'Int32'. 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM