我认为我涵盖了所有无效的可能性,但这一行:
double indicatorValue =
step2.Count() > 0 ? step2.Sum(iv => ((double?)iv.Value) ?? 0d) : 0d;
给了我这个错误:
无法创建类型为“System.Int32 []”的null常量值。在此上下文中仅支持实体类型,枚举类型或基元类型。
拜托,我已经阅读了一些帖子,没有人指出我的正确方法。
编辑:相关代码?
var step1 = db.IndicatorValues
.Where(iv =>
iv.Year == _ano &&
iv.IdIndicator == item.IdIndicator &&
idSites.Contains(iv.IdSite)
);
var step2 = step1.Where(iv =>
(isYTD == true ? iv.Month <= _mes : iv.Month == _mes)
);
答案 0 :(得分:1)
我可以看到的“null”案例如下:
class Program
{
class Test
{
public decimal? Value { get; set; }
}
static void Main(string[] args)
{
var step2 = new Test[] { null };
double indicatorValue = step2.Count() > 0 ? step2.Sum(iv => ((double?)iv.Value) ?? 0d) : 0d;
Console.WriteLine(indicatorValue);
}
}
这给了我NullReferrence异常
为了进一步诊断您的问题,我建议您在调试阶段使用step2
中的step2Test = step2.ToArray()
变量代替indicatorValue
在获取数组实例的阶段,您可能会遇到与描述中描述的错误相同的错误,那么与idSites.Contains(iv.IdSite)
计算的逻辑无关
int数组中有关null的错误可以在这里:iv.IdSite
在特定情况下,可能的问题idSites.Contains(iv.IdSite)
为空
请尝试以下方式
iv.IdSites == null ? false : ( idSites == null ? false : idSites.Contains(iv.IdSite))
把
{{1}}
答案 1 :(得分:1)
step1
和step2
IQueryable 而不是 IEnumerable ,因此Linq希望将((double?)iv.Value) ?? 0d
转换为SQL语句。
根据代码的其余部分(step1
和step2
用于其他内容),您可以通过以下方式解决此问题:
一个。将step2
转换为内存中集合(例如,使用.ToList()
)
湾在步骤2中过滤null
的IndicatorValues。
℃。 double indicatorValue = step2.Count() > 0 ? step2.Where(iv => iv.HasValue).Sum(iv => iv.Value) : 0d;
不确定iv.Value
类型是什么,为什么需要将它转换为double?但其中一种解决方案可能会奏效。