如果求和值全为空,如何使linq Sum返回null

时间:2009-08-24 13:48:02

标签: linq sum nullable

我有一个看起来像这样的LINQ查询...

var duration = Level3Data.AsQueryable().Sum(d => d.DurationMonths);

如果所有d.DurationMonths值都为null,则Sum返回0。如果所有null都是d.DurationMonths,如何让Sum返回null?或者,在执行总和之前,我是否需要首先运行单独的查询来消除这种情况?

5 个答案:

答案 0 :(得分:11)

除了之前关于扩展方法的建议 - 你可以使用三元运算符......

var duration = Level3Data.AsQueryable().Any(d => d.DurationMonths.HasValue) 
               ? Level3Data.AsQueryable().Sum(d => d.DurationMonths) 
               : null;

答案 1 :(得分:5)

您可以使用Aggregate提供自定义聚合代码:

var items = Level3Data.AsQueryable();
var duration = items.Aggregate<D,int?>(null, (s, d) => (s == null) ? d.DurationMonths : s + (d.DurationMonths ?? 0));

(假设Level3Data中的项目属于D

答案 2 :(得分:3)

var outputIndicatorSum = (from OutputIndicatorTable in objDataBaseContext.Output_Indicators
                                          where OutputIndicatorTable.Output_Id == outputId
                                          select (int?)OutputIndicatorTable.Status).Sum();
                int outputIndicatorSumReturn = Convert.ToInt32(outputIndicatorSum);
                return outputIndicatorSumReturn;

您可以显式地将强制转换非可空变量类型化为可空类型。 i.e, select (int?)OutputIndicatorTable.Status).Sum();

答案 3 :(得分:1)

单独使用Sum,这是不可能的。正如您在问题中指出的那样,您需要在致电Sum之前检查这种情况:

var q = Level3Data.AsQueryable();
var duration = q.All(d => d.DurationMonths == null)
                   ? null
                   : q.Sum(d => d.DurationMonths);

答案 4 :(得分:-1)

如果您希望在没有两个查询的情况下获得结果,请尝试:

var duration = Level3Data.AsQueryable()。Sum(d =&gt;(double?)d.DurationMonths);

如果您希望此查询的结果为零而不是null,请使用:

var duration = Level3Data.AsQueryable()。Sum(d =&gt;(double?)d.DurationMonths)?? 0;