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

tvmytwxo  于 2021-08-09  发布在  Java
关注(0)|答案(8)|浏览(574)

我有以下代码。我得到一个错误:
“对值类型'int32'的强制转换失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为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();

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

oyt4ldly

oyt4ldly1#

linq to sql查询不是作为代码执行的,而是转换为sql。有时这是一个“漏洞百出的抽象”,会产生意想不到的行为。
其中一种情况是空处理,在不同的地方可能会出现意外的空值。 ...DefaultIfEmpty(0).Sum(0) 在这种(非常简单的)情况下,可能没有元素和sql SUM 退货 null 而c#期望0。
更一般的方法是使用 ?? 将被翻译成 COALESCE 每当生成的sql有返回意外null的风险时:

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 案例。
基于这个答案,我写了一篇博客文章,详细介绍了linqtosql和linqtoentities。

vecaoik1

vecaoik12#

允许可为空的 Amount 字段中,只需使用null合并运算符将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();
cgh8pdjw

cgh8pdjw3#

我已经使用了这个代码,它的响应是正确的,只有输出值是可以为空的。

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
                            }
wsxa1bj1

wsxa1bj14#

您正在使用 aggregate 如果函数不获取要执行操作的项,则必须验证linq查询是否给出了以下结果:

var maxOrderLevel =sdv.Any()? sdv.Max(s => s.nOrderLevel):0
9nvpjoqh

9nvpjoqh5#

当我试图从视图中选择时出现此错误消息。
问题是视图最近获得了一些新的空行(在subscriberid列中),并且它没有在edmx中更新(ef database first)。
列必须是可为null的类型才能工作。
var dealer=context.dealers.where(x=>x.dealercode==dealercode).firstordefault();
视图刷新前:

public int SubscriberId { get; set; }

视图刷新后:

public Nullable<int> SubscriberId { get; set; }

在edmx中删除和添加视图是可行的。
希望它能帮助别人。

amrnrhlw

amrnrhlw6#

我看这个问题已经回答了。但是如果你想把它分成两个语句,可以考虑下面的语句。

var credits = from u in context.User
              join ch in context.CreditHistory 
                  on u.ID equals ch.UserID                                        
              where u.ID == userID
              select ch;

var creditSum= credits.Sum(x => (int?)x.Amount) ?? 0;
ylamdve6

ylamdve67#

在运行时使用以下代码在实体框架6中出现此错误:

var fileEventsSum = db.ImportInformations.Sum(x => x.FileEvents)

leandrosoares更新:
单次执行时使用此选项:

var fileEventsSum = db.ImportInformations.Sum(x => (int?)x.FileEvents) ?? 0

原件:
改成这样,然后就成功了:

var fileEventsSum = db.ImportInformations.Any() ? db.ImportInformations.Sum(x => x.FileEvents) : 0;
nmpmafwu

nmpmafwu8#

我也面临着同样的问题,通过使用“?”运算符将列设为可空来解决。

Sequnce = db.mstquestionbanks.Where(x => x.IsDeleted == false && x.OrignalFormID == OriginalFormIDint).Select(x=><b>(int?)x.Sequence</b>).Max().ToString();

有时返回null。

相关问题