强制转换types“Int32”失败,因为物化值为空

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

“转换为值typesInt32失败,因为物化值为null。结果types的generics参数或查询必须使用可空types。

当CreditHistory表没有logging时。

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。 有时这是一个“漏洞抽象”,会产生意想不到的行为。

一个这样的情况是空处理,在不同的地方可能会出现意外的空值。 ...DefaultIfEmpty(0).Sum(0)可以帮助在这个(很简单)的情况下,可能没有元素和sql的SUM返回null而C#预期0。

更一般的方法是使用?? 只要存在生成的SQL返回意外的空值的风险,就会将其转换为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#编译器,即使Sum()返回一个int ,这个expression式确实可以返回null 。 那我们用正常的?? 运算符来处理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(); 

你正在使用没有得到项目执行动作的aggregate函数,你必须validationlinq查询给出的结果如下:

 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; 

当我试图从视图中select时有这个错误信息。

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

该列必须是可空types才能工作。

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

刷新前查看:

 public int SubscriberId { get; set; } 

查看刷新后:

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

在EDMX中删除和添加视图。

希望它可以帮助别人。

在运行时用这个代码在entity framework6中得到了这个错误:

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

更改为这个,然后它的工作:

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