强制转换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;