从某个地方引用null我不知道在哪里

时间:2015-12-22 11:48:02

标签: c# entity-framework linq

我认为我涵盖了所有无效的可能性,但这一行:

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)
);

2 个答案:

答案 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)

step1step2 IQueryable 而不是 IEnumerable ,因此Linq希望将((double?)iv.Value) ?? 0d转换为SQL语句。

根据代码的其余部分(step1step2用于其他内容),您可以通过以下方式解决此问题:

一个。将step2转换为内存中集合(例如,使用.ToList()

湾在步骤2中过滤null的IndicatorValues。

℃。 double indicatorValue = step2.Count() > 0 ? step2.Where(iv => iv.HasValue).Sum(iv => iv.Value) : 0d;

不确定iv.Value类型是什么,为什么需要将它转换为double?但其中一种解决方案可能会奏效。