C# Can';t将nullable int设置为LINQ查询';返回值是多少?
我想根据某些条件从表中检索Id。如果不满足条件,我只想返回默认值(在本例中,我假设为null)。这是我的密码: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”。我
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
。