有没有办法(通过扩展机制?)让Sum()
函数全部返回0。
我现在的解决方法是写这样的,但我希望有更好的解决方案吗?
((int?)e.CampaignCodes.Sum(f => f.Enquiries.Count()) ?? 0),
答案 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;
}