我有以下代码。我收到错误消息:
“强制转换为值类型’Int32’,因为实例化值为null。结果类型的通用参数或查询必须使用可为空的类型。”
当CreditHistory表没有记录时。
var creditsSum = (from u in context.User join ch in context.CreditHistory on u.ID equals ch.UserID where u.ID == userID select ch.Amount).Sum();
如何修改查询以接受空值?
linq-to-sql查询不会作为代码执行,而是转换为SQL。有时,这是一种“泄漏抽象”,会产生意外的行为。
一种这样的情况是空值处理,在不同的地方可能会有意外的空值。...DefaultIfEmpty(0).Sum(0)可以在这种(非常简单)的情况下提供帮助,在这种情况下,可能没有任何元素,并且sql的SUM返回值是nullc#期望为0。
...DefaultIfEmpty(0).Sum(0)
SUM
null
一种更通用的方法是,只要有生成的SQL返回意外的null的风险,??就将其转换为COALESCE:
??
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案件。
int?
Sum()
int
基于此答案,我写了 一篇博客文章,其中详细介绍了LINQ to SQL和LINQ to Entities。