Linq a SQL Int16 se convierte como Int32 en el comando SQL
-
06-07-2019 - |
Pregunta
Con el parámetro del método
Int16? id
Y la cláusula Linq to SQL where
where !id.HasValue || m.Id == id
El texto de comando resultante para la condición en el contexto de datos es
Desde el visualizador:
SELECT [t0].[Id], [t0].[Name], [t0].[IsActive]
FROM [Model] AS [t0]
WHERE (CONVERT(Int,[t0].[Id])) = @p0
-------------------------------
@p0 [Int32]: 5
Mi clase asignada tiene el Id como Int16 y la base de datos en sí tiene el tipo de columna como smallint, entonces, ¿por qué el sql detrás de escena piensa que el parámetro es un entero (Int32) y no un smallint (Int16)?
Asignación de columnas:
[Column(IsPrimaryKey = true, DbType="SmallInt NOT NULL", CanBeNull=false)]
public Int16 Id { get; set; }
Solución
Cambiar la cláusula where para leer
where !id.HasValue || m.Id == id.Value
Hay algo en el corto anulable que lo está descartando. No estoy seguro de por qué, pero me encontré con esto antes y descubrí que agregar .Value
funcionará.
Otros consejos
Hmmm ... noto que no obtienes ninguna representación de! id.HasValue en el sql. ¿Quizás este es algún tipo de truco relacionado con que se envuelva? Me parece falso, pero lo único en lo que puedo pensar.