为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梦里花落0921 2019-08-12 17:08:12
转换为值类型“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();如何修改查询以接受空值?
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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。


查看完整回答
反对 回复 2019-08-12
?
偶然的你

TA贡献1841条经验 获得超3个赞

要允许可空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();


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 1487 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信