无法将可空 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.NamecircuitType 之间不匹配,则 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;