我想根据特定条件从表中检索Id。如果没有满足标准,我只想返回默认值(在这种情况下,我假设为null)。这是我的代码:
int? circuitTypeId = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType).Id;
我假设如果ct.Name
和circuitType
之间没有匹配,则返回的值为null
。但是,在运行我的程序时,我在这一行上收到一条错误,说“"空引用异常"”。我知道该记录不存在,但是我不能将查询返回的null
分配给我的nullable int
变量吗?
答案 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;