【问题标题】:Linq to SQL Int16 Gets Converted as Int32 In SQL CommandLinq to SQL Int16 在 SQL 命令中被转换为 Int32
【发布时间】:2009-10-28 03:06:31
【问题描述】:

带方法参数

Int16? id

Linq to SQL 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

我的映射类的Id为Int16,而数据库本身的列类型为smallint,那么为什么幕后sql认为参数是整数(Int32)而不是smallint(Int16)?


列映射:

    [Column(IsPrimaryKey = true, DbType="SmallInt NOT NULL", CanBeNull=false)]
    public Int16 Id { get; set; }

【问题讨论】:

    标签: c# linq-to-sql type-conversion


    【解决方案1】:

    将 where 子句改为读取

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

    有一些关于可空短的东西正在抛弃它。我不知道为什么,但我之前遇到过这个问题,发现添加 .Value 会起作用。

    【讨论】:

    • WHERE (CONVERT(Int,[t0].[Id])) = @p0 变为 WHERE [t0].[Id] = @p0,这很好,但 @p0 仍然是 int32 是这正常吗?
    • 似乎最好使用这个 where 子句: if (id.HasValue) { qry = qry.Where(x => x.Id == id.Value); } --- (当使用 .Value 和原来的,当它实际上是 null 它打破)
    • 剩下的唯一问题是:为什么是@p0 [Int32] 而不是[Int16]
    • 我已经通过反射器挖掘了 linq to sql 代码。似乎在某些时候 id.Value 被翻译成文字,比如 42,然后被视为 int。在处理文字时,C# 不会将 short 视为一种可能性。它从 int 开始,一直向上。我无法追踪足够多的代码来证明它正在做什么,但似乎是这样。它似乎也没有害处。
    【解决方案2】:

    嗯...我注意到您在 sql 中没有得到任何 !id.HasValue 的表示形式。也许这是与包裹相关的某种诡计?对我来说似乎很假,但我唯一能想到的。

    【讨论】:

    • 如果 id.HasValue,则 m.Id == id 将被评估,否则将忽略整个条件:将不存在 where 条件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多