【问题标题】:LINQ expression return nullLINQ 表达式返回 null
【发布时间】:2010-01-27 01:15:46
【问题描述】:

我在 LINQ 中有以下查询。 “符号”不存在,查询为空,但我得到一个错误,铸造和程序崩溃。

decimal x = from cie in m_entities.Cie
            where cie.symbol.Equals(Symbol)
            select cie.cie_id;

或者我可以在 x 中有一个 null 吗?

【问题讨论】:

  • 您收到的确切异常消息是什么?
  • 假设m_entities.Cie 是一个IQueryable 或IEnumerable,这个程序如何编译以在运行时产生异常,因为查询的结果应该是一个IEnumerable 而不是小数?

标签: c# linq entity-framework


【解决方案1】:

我认为 x 永远不会为空——你只会得到一个空的 IQueryable<T>(或者是 IEnumrable<T>?),其中 T 是 cie_id 的数据类型。

转换错误是因为您试图将集合转换为 decimal

【讨论】:

  • ...所以您可以将查询包装在(...) 中,然后调用.FirstOrDefault() 以返回唯一结果或0
  • 转换是隐式的,因为查询返回一个集合,但x 被声明为decimal。如果xvar 声明,则不会有InvalidCastException,但x 也不会是decimal
  • 这不应该在编译时产生“无法将类型 'IEnumerable' 隐式转换为 'decimal'”的错误吗?
  • 是的,我认为确实如此,但问题尚不清楚。
【解决方案2】:

假设 cie_id 是小数,那么试试这个:

decimal x = (from cie in m_entities.Cie
                     where cie.symbol.Equals(Symbol)
                     select cie.cie_id).FirstOrDefault()

您当前的代码尝试将 IEnumerable 分配给十进制,但这是行不通的。 FirstOrDefault 将选择第一个匹配项(如果有),否则为 0。

如果您知道会有 1 个或 0 个匹配项,您可以考虑 SingleOrDefault 而不是 FirstOrDefault。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多