代码之家  ›  专栏  ›  技术社区  ›  Simon Keep

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

  •  15
  • Simon Keep  · 技术社区  · 16 年前

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

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

    如果所有 d.DurationMonths 0 .我怎样才能退还这笔钱 null ?或者,在执行求和之前,我需要先运行一个单独的查询来消除这种情况吗?

    5 回复  |  直到 9 年前
        1
  •  11
  •   Scott Ivey    16 年前

    除了前面关于扩展方法的建议外,您还可以使用三元运算符。..

    var duration = Level3Data.AsQueryable().Any(d => d.DurationMonths.HasValue) 
                   ? Level3Data.AsQueryable().Sum(d => d.DurationMonths) 
                   : null;
    
        2
  •  5
  •   Thomas Levesque    9 年前

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

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

    (假设中的项目 Level3Data 类型 D )

        3
  •  3
  •   Rahul vats Vijay Singh    12 年前
    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();

        4
  •  1
  •   Erik Forbes    16 年前

    var q = Level3Data.AsQueryable();
    var duration = q.All(d => d.DurationMonths == null)
                       ? null
                       : q.Sum(d => d.DurationMonths);
    
        5
  •  -1
  •   C Tierney    12 年前

    如果你想得到没有两个查询的结果,请尝试:

    var持续时间=Level3Data。AsQueryable()。总和(d=>(双倍?)d。持续时间月);

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

    var持续时间=Level3Data。AsQueryable()。总和(d=>(双倍?)d。持续时间(月)?? 0;