我有一个看起来像这样的LINQ查询...
var duration = Level3Data.AsQueryable().Sum(d => d.DurationMonths);
如果所有d.DurationMonths
值都为null,则Sum返回0
。如果所有null
都是d.DurationMonths
,如何让Sum返回null
?或者,在执行总和之前,我是否需要首先运行单独的查询来消除这种情况?
答案 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;