Linq2SQL:始终使.Sum()返回0而不是null

4

有没有什么方式(通过扩展机制?)可以让Sum()函数始终返回0。

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

((int?)e.CampaignCodes.Sum(f => f.Enquiries.Count()) ?? 0),
4个回答

6
您的解决方法很好。为什么不编写一个类似于Sum的IEnumerable扩展方法,名为SumOrDefault呢?然后您可以重复使用您的扩展方法,就不必再看到这个解决方法了。
您的扩展方法将会非常简单,只需使用您的解决方法中的代码即可。

2

实际上,这是一种相当好的方法。我认为更好的问题是为什么一开始它是null?除非您调用sum的实体为null,否则查询应始终返回0。在开始时检查实体是否有效可能是更好的解决方案,而不是强制sum始终返回0 - Null表示存在问题。


1

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

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

要了解NULL的复杂性的更多信息,请阅读Chris Date和Hugh Darwen关于此主题的一些著作。


你说得对。返回0的问题在于这将要求任何可加对象都具有中性元素,这很奇怪,因为我可以写a + b而不需要一个中性元素。 - Dario

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接