linq-to-SQL查询不会作为代码执行,而是转换为sql。有时,这是一种“泄漏抽象”,会产生意外的行为。
一种这样的情况是空值处理,在不同的地方可能会有意外的空值。...DefaultIfEmpty(0).Sum(0)
可以在这种(非常简单)的情况下提供帮助,在这种情况下,可能没有任何元素,并且sql的SUM
返回值是null
c#期望为0。
一种更通用的方法是,只要有生成的sql返回意外的null的风险,??
就将其转换为COALESCE
:
var creditsSum = (from u in context.User
join ch in context.CreditHistory on u.ID equals ch.UserID
where u.ID == userID
select (int?)ch.Amount).Sum() ?? 0;
这首先int?
要告诉C#编译器null
,即使Sum()
返回一个,该表达式的确可以返回int
。然后,我们使用普通??
运算符处理该null
案件。