如何处理 entity framework 求和函数中的空值

How to handle null value in entity framework sum function

我的代码在这里:

Int64? amount = db.Items.Where(x => x.ItemOrdered == true).Sum(x => x.Price);

工作正常但通过错误数据库为空

The cast to value type 'System.Int32' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

我想用 0(零)替换它
我正在将实体框架与 MVC 应用程序一起使用

试试这个

var amount = db.Items.Where(x => x.ItemOrdered == true).Sum(x => x.Price ?? 0);

编辑: 如果 Price 不可为空,如评论中所述。
所以,使用这个

var amount = db.Items.Where(x => x.ItemOrdered == true).Sum(x => x.Price);
// for null check for amount use `?? 0`

另一个选项是过滤掉空值:

var amount = db.Items.Where(x => x.ItemOrdered == true && x.Price != null).Sum(x => x.Price);

问题不在于 'Price' 数据类型可以为空。实际上问题在于它不可为空并且有一个空集。如果 EF Sum() 函数处理可为空的数据,则它只能处理空集。我知道这没有意义,因为空集和可空类型根本不是一回事。只需将其转换为可为空的类型,您就会得到一个可为空的响应。在空集的情况下,响应将为空。所以这是唯一可行的情况。

Int64? amount = db.Items.Where(x => x.ItemOrdered == true).Sum(x => (Int64?) x.Price);

对于因为 Price not 可为 null 而 where 子句返回空集而遇到问题的任何人,您可以将 price 强制转换为可为 null,然后将 null 合并检查移到外部:

Int64 amount = db.Items.Where(x => x.ItemOrdered == true).Sum(x => (Int64?) x.Price) ?? 0;

还有一种方法是使用 Linq 中的 DefaultIfEmpty 方法:

var amount = db.Items.Where(x => x.ItemOrdered).Select(x => x.Price).DefaultIfEmpty(0).Sum();