首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >转换为值类型'Int32‘失败,因为物化值为null

转换为值类型'Int32‘失败,因为物化值为null
EN

Stack Overflow用户
提问于 2011-07-28 19:05:24
回答 8查看 152.9K关注 0票数 207

我有下面的代码。我搞错了:

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

当CreditHistory表没有记录时。

代码语言:javascript
运行
复制
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();

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-07-28 19:12:20

linq到SQL查询不是以代码的形式执行,而是转换为SQL。有时,这是一种“漏出的抽象”,会产生意想不到的行为。

其中一种情况是null处理,其中可能在不同的地方出现意外的空值。在这种情况下,...DefaultIfEmpty(0).Sum(0)可以提供帮助(非常简单),在这种情况下,可能没有元素,而sql的SUM返回null,而c#预期为0。

一种更普遍的方法是使用??,当生成的COALESCE有返回意外null的风险时,它将被转换为COALESCE

代码语言:javascript
运行
复制
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和LINQ实体的详细信息。

票数 359
EN

Stack Overflow用户

发布于 2011-07-28 19:08:02

若要允许Amount字段为空,只需使用空合并运算符将空值转换为0。

代码语言:javascript
运行
复制
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();
票数 8
EN

Stack Overflow用户

发布于 2017-03-20 07:25:53

我使用了这段代码,它的响应是正确的,只有输出值是空的。

代码语言:javascript
运行
复制
var packesCount = await botContext.Sales.Where(s => s.CustomerId == cust.CustomerId && s.Validated)
                                .SumAsync(s => (int?)s.PackesCount);
                            if(packesCount != null)
                            {
                                // your code
                            }
                            else
                            {
                                // your code
                            }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6864311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档