无法将nullable int设置为LINQ查询的返回值?

时间:2015-01-05 05:33:50

标签: c# linq

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

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

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

5 个答案:

答案 0 :(得分:5)

根据您的疑问,您的假设是错误的: -

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

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

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

答案 1 :(得分:4)

试试这个:

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

答案 2 :(得分:2)

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

int? circuitTypeId;

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

答案 3 :(得分:1)

问题是.Id可能试图引用null 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);

答案 4 :(得分:1)

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

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