【问题标题】:Can't set nullable int to LINQ query's return value?无法将可为空的 int 设置为 LINQ 查询的返回值?
【发布时间】:2015-01-05 05:33:49
【问题描述】:

我想根据某些条件从表中检索 Id。如果不满足条件,我只想返回默认值(在这种情况下,我假设为 null)。这是我的代码:

int? circuitTypeId = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType).Id;

我假设如果ct.NamecircuitType 之间不匹配,则返回的值为null。但是,在运行我的程序时,我在这一行收到一条错误消息,提示“空引用异常”。我知道该记录不存在,但我不应该将查询返回的null 分配给我的nullable int 变量吗?

【问题讨论】:

  • 不,目前您需要在取消引用 Id 之前显式检查 null。或者你可以等待Roslyn's Elvis运营商?. :)
  • FirstOrDefault 在这种情况下毫无价值,因为您正试图从潜在的null 访问IdFirst 至少会抛出一个更好的异常。

标签: c# linq


【解决方案1】:

在 C# 版本 6 中,您只需在 id 之前添加 ? 即可防止引用空对象的属性。

int? circuitTypeId = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType)?.Id;

【讨论】:

    【解决方案2】:

    根据您的查询,您的假设是错误的:-

    int? circuitTypeId = cimsContext.CircuitTypes
                                    .FirstOrDefault(ct => ct.Name == circuitType).Id;
    

    这将在找到匹配项时返回int,但当没有名称与circuitType 匹配时,它将抛出Null Reference Exception。你应该这样做:-

    var circuitTypeObj = cimsContext.CircuitTypes
                                    .FirstOrDefault(ct => ct.Name == circuitType);
    int? circuitTypeId = circuitTypeObj == null ? (int?)null : circuitTypeObj.Id;
    

    【讨论】:

      【解决方案3】:

      试试这个:

      int? circuitTypeId = cimsContext.CircuitTypes.Where(ct => ct.Name == circuitType).Select(p => p.Id).FirstOrDefault();
      

      【讨论】:

      • 这应该是公认的答案 ;-) 简洁明了,没有不必要的ifs。
      • 不。这将返回 0 而不是 null
      【解决方案4】:

      在分配circuitTypeId 变量之前,您应该首先检查null

      int? circuitTypeId;
      
      var circuitType = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType);
      if(circuitType != null)
      {
          circuitTypeId = circuitType.Id;
      }
      

      【讨论】:

        【解决方案5】:

        问题是.Id 可能试图引用一个空的 CirctuitType。

        var circuitType = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType);
        int? circuitTypeId = circuitType.Id; // if circuitType is null, a null reference exception is thrown
        

        相反,您需要测试 null 的引用:

        var circuitType = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType);
        int? circuitTypeId = (circuitType == null ? (int?)null : circuitType.Id);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-16
          相关资源
          最近更新 更多