C# Can';t将nullable int设置为LINQ查询';返回值是多少?

C# Can';t将nullable int设置为LINQ查询';返回值是多少?,c#,linq,C#,Linq,我想根据某些条件从表中检索Id。如果不满足条件,我只想返回默认值(在本例中,我假设为null)。这是我的密码: int? circuitTypeId = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType).Id; 我假设如果ct.Name和circuitType之间不匹配,则返回的值为null。然而,当运行我的程序时,我在这一行上得到一个错误,说“Null reference exception”。我

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

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

我假设如果
ct.Name
circuitType
之间不匹配,则返回的值为
null
。然而,当运行我的程序时,我在这一行上得到一个错误,说“Null reference exception”。我知道记录不在那里,但我是否应该能够将查询返回的
null
分配给我的
null int
变量?

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

int? circuitTypeId;

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

问题是
。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);
试试这个:

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

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

int? circuitTypeId = cimsContext.CircuitTypes
                                .FirstOrDefault(ct => ct.Name == circuitType).Id;
当找到匹配项时,它将返回
int
,但当没有名称与
circuitType
的名称匹配时,它将抛出
Null引用异常。您应该这样做:-

var circuitTypeObj = cimsContext.CircuitTypes
                                .FirstOrDefault(ct => ct.Name == circuitType);
int? circuitTypeId = circuitTypeObj == null ? (int?)null : circuitTypeObj.Id;
在C#version 6中,您只需在
id
之前添加一个
,即可防止引用空对象的属性

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

不,目前您需要在取消引用Id之前显式检查null。或者您可以等待运算符
?。
:)
第一个默认值在这种情况下毫无价值,因为您试图从潜在的
null
访问
Id
<代码>首先
至少会抛出一个更好的异常。这应该是可接受的答案;-)短而干净,无不必要的
if
s.Nope。这将返回一个
0
,而不是
null