【问题标题】:InvalidCastException in a LINQ queryLINQ 查询中的 InvalidCastException
【发布时间】:2012-02-06 21:44:51
【问题描述】:

对于这个 LINQ 查询,我得到以下异常:

(from row in ds.Tables[0].AsEnumerable()
 where row.Field<string>("Dept_line_code") == DeptCode &&
 row.Field<string>("Skill_Name") == skill &&
 row.Field<string>("Acct_Code") == account && row.Field<string>("Location") == dtNewTable.Rows[intRow]["Location"].ToString()
 select row.Field<int>("Presently_Available") == null ? 0 : row.Field<int>("Presently_Available")
).FirstOrDefault();

异常信息:

异常类型:InvalidCastException

异常消息:无法将 DBNull.Value 转换为类型“System.Int32”。请使用可空类型。

我不知道可空类型,也不知道如何使用可空类型来克服此异常。

【问题讨论】:

  • 简而言之:默认情况下,原始类型(如intdoublefloat、...)不能分配空值。这个问题的解决方案是使用可空类型(如int?),它实际上只是原始类型的包装器。
  • 看来你用的是DataSet,可能是DataAdapter填充的。如果您确定生成的查询仅包含单个表,则可以不填写 DataSet but a DataTable
  • 什么时候需要使用可空类型?什么场景?为什么我们必须使用相同的?需要有关 NUllable 类型的用途和优缺点的信息?
  • @sukumar 谷歌“可空类型 C#”并阅读它。你需要学习如何研究自己的问题,而不是要求别人给你答案。

标签: c# linq linq-to-sql .net-3.5 exception-handling


【解决方案1】:

你必须让 int 接受空值 => int?

row.Field<int?>("Presently_Available") == null ? 0 : row.Field<int>("Presently_Available") ;

这是可空类型的link

【讨论】:

  • 您可能应该在您的答案中提供一个链接或可空类型的简要说明。 OP 无法理解为什么 int? 解决了他的问题。
  • 哇,搜索了几个小时才发现我只需要一个问号!
【解决方案2】:

row.Field&lt;int&gt; 更改为row.Field&lt;int?&gt;

【讨论】:

    【解决方案3】:
    select row.Field<int?>("Presently_Available")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 2011-05-24
      • 2023-04-10
      相关资源
      最近更新 更多