Linq2SQL:总是让.Sum()返回0而不是null

时间:2009-02-10 13:40:33

标签: c# linq-to-sql null

有没有办法(通过扩展机制?)让Sum()函数全部返回0。

我现在的解决方法是写这样的,但我希望有更好的解决方案吗?

((int?)e.CampaignCodes.Sum(f => f.Enquiries.Count()) ?? 0),

4 个答案:

答案 0 :(得分:6)

你的解决方法很好。为什么不为IEnumerable编写一个类似于Sum的扩展方法,称为SumOrDefault。然后你可以重用你的扩展方法,你不必看到解决方法。

您的扩展方法非常简单,只需使用解决方法中的确切代码即可。

答案 1 :(得分:2)

实际上,这是一个非常好的方式。我认为更好的问题是为什么它开始时为空?除非您调用sum的实体为null,否则查询应始终返回0.这可能是一个更好的解决方案,可以查看您的实体在开始时是否有效,而不是强制总和始终返回0 - Null表示有一个问题。

答案 2 :(得分:1)

它是0还是null的问题是一个棘手的问题。这取决于你解释“总和”的含义。如果它是“所有(选定的)记录的总和”,则当任何记录包含NULL时,null是合适的,因为从技术上讲,您不确定。如果它表示“所有已知(选定)记录的总和”,则应返回0.

哪一个适合你的情况只有你可以决定,所以我认为你在这里所做的并不是一个糟糕的解决方案。

有关NULL棘手的更多信息,请阅读Chris Date和Hugh Darwen关于此主题的一些着作。

答案 3 :(得分:1)

编写扩展方法:

public static Decimal? CorrectSum<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
{
    Decimal? sum = null;
    foreach (TSource s in source)
    {
        Decimal? val = selector(s);

        if (val.HasValue == true)
        {
            sum = (sum ?? 0) + val;
        }
    }

    return sum;
}