有没有什么方式(通过扩展机制?)可以让Sum()
函数始终返回0。
我现在的解决方法是像这样写,但我希望有更好的解决方案?
((int?)e.CampaignCodes.Sum(f => f.Enquiries.Count()) ?? 0),
有没有什么方式(通过扩展机制?)可以让Sum()
函数始终返回0。
我现在的解决方法是像这样写,但我希望有更好的解决方案?
((int?)e.CampaignCodes.Sum(f => f.Enquiries.Count()) ?? 0),
实际上,这是一种相当好的方法。我认为更好的问题是为什么一开始它是null?除非您调用sum的实体为null,否则查询应始终返回0。在开始时检查实体是否有效可能是更好的解决方案,而不是强制sum始终返回0 - Null表示存在问题。
关于应该是0还是null的问题是一个棘手的问题。这取决于你如何解释“总和”。如果它是“所有(选定的)记录的总和”,当任何一条记录包含NULL时,null将是合适的,因为从技术上讲,你不确定。如果它意味着“所有已知(选定的)记录的总和”,则应返回0。
哪个在你的情况下更合适是只有你可以决定的事情,所以我认为你在这里做的并不是一个坏的解决方案。
要了解NULL的复杂性的更多信息,请阅读Chris Date和Hugh Darwen关于此主题的一些著作。
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;
}