Linq in SQL Int16 viene convertito come Int32 nel comando SQL
-
06-07-2019 - |
Domanda
Con il parametro del metodo
Int16? id
E la clausola Linq to SQL where
where !id.HasValue || m.Id == id
Il testo del comando risultante per la condizione nel contesto dei dati è
Dal visualizzatore:
SELECT [t0].[Id], [t0].[Name], [t0].[IsActive]
FROM [Model] AS [t0]
WHERE (CONVERT(Int,[t0].[Id])) = @p0
-------------------------------
@p0 [Int32]: 5
La mia classe mappata ha l'ID come Int16 e il database stesso ha il tipo di colonna come smallint, quindi perché sql dietro le quinte pensa che il parametro sia un intero (Int32) e non un smallint (Int16)?
Mappatura colonne:
[Column(IsPrimaryKey = true, DbType="SmallInt NOT NULL", CanBeNull=false)]
public Int16 Id { get; set; }
Soluzione
Modifica la clausola where da leggere
where !id.HasValue || m.Id == id.Value
C'è qualcosa nel breve nulla che lo sta gettando via. Non sono sicuro del perché, ma mi sono imbattuto in questo prima e ho scoperto che l'aggiunta di .Value
funzionerà.
Altri suggerimenti
Hmmm ... noto che non stai ottenendo alcuna rappresentazione di! id.HasValue in sql. Forse questa è una sorta di inganno correlato a quello che viene impacchettato? Mi sembra falso, ma l'unica cosa a cui riesco a pensare.