Linq to SQL Int16 est converti en tant que Int32 dans une commande SQL
-
06-07-2019 - |
Question
Avec le paramètre de méthode
Int16? id
Et la clause Linq to SQL où la clause
where !id.HasValue || m.Id == id
Le texte de commande résultant de la condition dans le contexte de données est
.À partir du visualiseur:
SELECT [t0].[Id], [t0].[Name], [t0].[IsActive]
FROM [Model] AS [t0]
WHERE (CONVERT(Int,[t0].[Id])) = @p0
-------------------------------
@p0 [Int32]: 5
Ma classe mappée a l'Id en tant qu'Int16 et la base de données elle-même a le type de colonne en tant que smallint, alors pourquoi le créateur d'arrière-plans pense-t-il que le paramètre est un entier (Int32) et non un smallint (Int16)? <
Mappage de colonnes:
[Column(IsPrimaryKey = true, DbType="SmallInt NOT NULL", CanBeNull=false)]
public Int16 Id { get; set; }
La solution
Modifiez la clause where pour lire
where !id.HasValue || m.Id == id.Value
Il y a quelque chose dans le court-circuit annulable qui le jette. Je ne sais pas pourquoi, mais je me suis déjà heurté à cela et je me suis aperçu que l'ajout de .Value
fonctionnerait.
Autres conseils
Hmmm ... Je remarque que vous n'obtenez aucune représentation de la! id.HasValue dans le SQL. Peut-être est-ce une sorte de ruse liée à l’emballage? Cela me semble faux, mais la seule chose à laquelle je peux penser.