无法将可空 int 设置为 LINQ 查询的 return 值?
Can't set nullable int to LINQ query's return value?
我想根据特定条件从 table 中检索一个 ID。如果不满足条件,我只想 return 默认值(在这种情况下,我假设为空)。这是我的代码:
int? circuitTypeId = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType).Id;
我假设如果 ct.Name
和 circuitType
之间不匹配,则 returned 的值是 null
。但是,在运行我的程序时,我在这一行收到错误 "Null reference exception"。我知道记录不存在,但我不应该能够将查询的 null
return 分配给我的 nullable 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
相反,您需要测试引用是否为空:
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;
这将在找到匹配时 return int
,但当没有名称与 circuitType
匹配时,它会抛出 Null Reference Exception
。你应该这样做:-
var circuitTypeObj = cimsContext.CircuitTypes
.FirstOrDefault(ct => ct.Name == circuitType);
int? circuitTypeId = circuitTypeObj == null ? (int?)null : circuitTypeObj.Id;
在 C# 版本 6 中,您可以简单地在 id
之前添加一个 ?
以防止引用空对象的属性。
int? circuitTypeId = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType)?.Id;
我想根据特定条件从 table 中检索一个 ID。如果不满足条件,我只想 return 默认值(在这种情况下,我假设为空)。这是我的代码:
int? circuitTypeId = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType).Id;
我假设如果 ct.Name
和 circuitType
之间不匹配,则 returned 的值是 null
。但是,在运行我的程序时,我在这一行收到错误 "Null reference exception"。我知道记录不存在,但我不应该能够将查询的 null
return 分配给我的 nullable 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
相反,您需要测试引用是否为空:
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;
这将在找到匹配时 return int
,但当没有名称与 circuitType
匹配时,它会抛出 Null Reference Exception
。你应该这样做:-
var circuitTypeObj = cimsContext.CircuitTypes
.FirstOrDefault(ct => ct.Name == circuitType);
int? circuitTypeId = circuitTypeObj == null ? (int?)null : circuitTypeObj.Id;
在 C# 版本 6 中,您可以简单地在 id
之前添加一个 ?
以防止引用空对象的属性。
int? circuitTypeId = cimsContext.CircuitTypes.FirstOrDefault(ct => ct.Name == circuitType)?.Id;