转换为值类型'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();
如何修改查询以接受空值?
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