Linq to SQL Int16 преобразуется в Int32 в команде SQL

2

С параметром метода

Int16? id

И предложение Linq to SQL where where

where !id.HasValue || m.Id == id

Полученный текст команды для условия в контексте данных

Из визуализатора:

SELECT [t0].[Id], [t0].[Name], [t0].[IsActive]
FROM [Model] AS [t0]
WHERE (CONVERT(Int,[t0].[Id])) = @p0
-------------------------------
@p0 [Int32]: 5

Мой сопоставленный класс имеет идентификатор как Int16, а сама база данных имеет тип столбца как маленький, поэтому почему за кулисами sql считает, что этот параметр является целым числом (Int32), а не маленьким (Int16)?


Отображение столбцов:

    [Column(IsPrimaryKey = true, DbType="SmallInt NOT NULL", CanBeNull=false)]
    public Int16 Id { get; set; }
Теги:
type-conversion
linq-to-sql

2 ответа

5
Лучший ответ

Измените предложение where, чтобы прочитать

where !id.HasValue || m.Id == id.Value

Есть что-то о нулевом коротком, который отбрасывает его. Я не уверен, почему, но я столкнулся с этим раньше и нашел, что добавление .Value будет работать.

  • 0
    WHERE (CONVERT (Int, [t0]. [Id])) = @ p0 становится WHERE [t0]. [Id] = @ p0, что здорово, но @ p0 все еще является int32, это нормально?
  • 0
    Также кажется, что лучше использовать это предложение where: if (id.HasValue) {qry = qry.Where (x => x.Id == id.Value); } --- (при использовании .Value с оригиналом и когда он фактически равен нулю, он ломается)
Показать ещё 3 комментария
0

Хммм... Я замечаю, что вы не получаете никакого представления id.HasValue в sql. Возможно, это какой-то обман, связанный с тем, что он обернулся? Кажется мне притворным, но единственное, что я могу придумать.

  • 1
    если id.HasValue, то m.Id == id будет оцениваться, в противном случае все условие будет проигнорировано: условие where не будет присутствовать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню