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

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

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


当前回答

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

其他回答

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

问题是视图最近获得了一些新的空行(在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中删除和添加视图是可行的。

希望它能帮助到别人。

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

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

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;

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

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
                            }

你正在使用聚合函数,不让项目执行动作,你必须验证linq查询是给出如下结果:

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