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

我有下面的代码。我得到错误:

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

当creditthhistory表没有记录时。

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();

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

153007 次浏览

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

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到SQL和LINQ到实体的详细信息。

你正在使用aggregate函数,它没有让项目执行动作,你必须验证linq查询是否给出如下结果:

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

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

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
}

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

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;

当我试图从视图中进行选择时,出现了这个错误消息。

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

列必须为Nullable类型才能工作。

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

刷新视图前:

public int SubscriberId { get; set; }

刷新视图后:

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

在EDMX中删除和添加视图是可行的。

希望它能帮助到别人。

在实体框架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;

我也面临着同样的问题,并通过使用“?”操作符使列为空来解决。

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

有时返回null。