转换为值类型'Int32'失败,因为物化值为空

本文关键字:因为 失败 转换 Int32 类型 | 更新日期: 2023-09-27 18:04:06

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

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

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

转换为值类型'Int32'失败,因为物化值为空

linq-to-sql查询不是作为代码执行的,而是转换为SQL。有时,这是一个"有漏洞的抽象",会产生意想不到的行为。

一个这样的例子是null处理,在不同的地方可能会有意想不到的null。...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字段为空,只需使用空合并运算符将空转换为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();

当我尝试从视图中选择时出现此错误消息

问题是视图最近获得了一些新的空行(在SubscriberId列中),并且它还没有在EDMX(首先是EF数据库)中更新。

列必须为可空类型才能工作。

var dealer = Context.Dealers。Where(x => x.dealerCode == dealerCode).FirstOrDefault();

视图刷新前:

public int SubscriberId { get; set; }

视图刷新后:

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

在EDMX中删除和添加视图工作。

希望能帮到别人。

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

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
                            }

您正在使用aggregate函数,该函数没有获得项目来执行操作,您必须验证linq查询是否给出如下结果:

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

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

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;

在Entity Framework 6中运行时出现此错误:

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

Update from LeandroSoares:

用于单次执行:

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

改成这个就可以了:

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

我也面临同样的问题,并通过使用"?"操作符将列设置为可空来解决。

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

有时返回null

相关文章: