小编典典

转换为值类型“Int32”失败,因为具体化值为 null

all

我有以下代码。我收到错误:

“转换为值类型‘Int32’失败,因为具体化值为空。结果类型的泛型参数或查询必须使用可为空的类型。”

当 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();

如何修改查询以接受空值?


阅读 95

收藏
2022-06-30

共1个答案

小编典典

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情况。

基于这个答案,我写了 一篇博客文章,其中包含 LINQ to SQL 和 LINQ to Entities 的详细信息。

2022-06-30