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

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

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


当前回答

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

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

有时返回null。

其他回答

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

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

有时返回null。

要允许一个可为空的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。那我们就用正规的??运算符来处理空大小写。

基于这个答案,我写了一篇博文,详细介绍了LINQ to SQL和LINQ to实体。

你正在使用聚合函数,不让项目执行动作,你必须验证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
                            }