在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'.