【问题标题】:LINQ: Cannot convert short to short?LINQ:不能将short转换为short?
【发布时间】:2014-03-07 06:15:48
【问题描述】:

不能隐式转换类型“short”?在 LocalAmount = t.EmpNo 处“做空”。我使用了Convert.ToInt16(t.EmpNo),但随后'join' 子句将出错并成为"incorrect", "type inference failed..."

    public class AccountTransaction
    {
        public Int16 LocalAmount { get; set; }
        public String AccountNumber { get; set; }
    }

    public static IEnumerable<AccountTransaction> GetAllTransactions()
    {
        using (var context = new SQL_TA_SCOREBOARDEntities1())
        {
            return (from t in context.EmployeeAccesses
                    join acc in context.View_HCM
                         on t.EmpNo equals acc.EmpNo
                    select new AccountTransaction
                    {
                        LocalAmount = t.EmpNo,
                        AccountNumber = acc.EmailAddress

                    }).ToList();
        }
    }

【问题讨论】:

  • 为什么不只是“在 (Int16)t.EmpNo 上等于 acc.EmpNo”
  • 在您的数据库后端,大概是EmployeeAccesses.EmpNo 不是明确的NOT NULL。考虑将public Int16 LocalAmount 更改为public Int16? LocalAmount
  • 您使用的是 LINQ-to-SQL 还是 EF?哪个 .NET 版本?
  • 哦,好吧,对不起大家,我对 NULLABLE 问题一无所知。现在我明白了。非常感谢!

标签: c# asp.net sql linq dbml


【解决方案1】:

您的错误消息指出 t.EmpNo 是 可为空的 Int 16。看到 short 后面的问号了吗?

'short?' to 'short' - 表示:我无法将Int16? 转换为Int16 问号定义,该值可以是null

所以如果你改变你的模型,你不需要解析任何东西,但你需要使用t.EmpNo.Value

public class AccountTransaction
{
    public Int16? LocalAmount { get; set; }
    public String AccountNumber { get; set; }
}

【讨论】:

  • 抱歉,这是我的第二个选项,我在“加入”中得到错误。但是如果我删除 Convert.ToInt16,我会得到不能隐式地将 short 转换为 short。
  • 好的,谢谢。现在我得到那个旧的“join 子句中的一个表达式的类型不正确。类型推断在调用‘join’时失败。”错误。我现在该怎么办?
【解决方案2】:

很可能 EmpNo 永远不应该为空,并且您的 EmpNo 之一在数据库中可以为空,而另一个则不是。确保两者都不可为空。如果由于某种原因它们有时应该可以为 Null,那么它们在数据库中都必须可以为空。如果发生这种情况并且您在数据库中修复了它,您将不得不重新加载您的实体框架模型并再次尝试您的代码。您可能需要更改公共 Int16?本地金额 { 获取;放; } 返回公共 Int16 LocalAmount { get;放; }。

本质上: Empno 必须在任何地方都不可为空或在任何地方都可以为空。在数据库和代码中。

【讨论】:

  • 还是使用 .GetValueOrDefault() 在 Int16 之间转换?和 Int16
  • 感谢指教!现在我开始掌握这个概念,我很难从已发表的资料中找到这个概念。如果我有足够的代表,我会投票。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2015-06-10
相关资源
最近更新 更多