转换为值类型“Int32”失败,因为实现值为null

转换为值类型“Int32”失败,因为实现值为null

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

“转换为值类型'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();

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


梦里花落0921
浏览 1493回答 3
3回答

宝慕林4294392

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。

偶然的你

要允许可空Amount字段,只需使用null合并运算符将空值转换为0。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 ?? 0).Sum();
打开App,查看更多内容
随时随地看视频慕课网APP