如何在实体框架求和函数

时间:2015-09-19 16:13:30

标签: c# linq-to-sql

Screenshot

我的代码在这里:

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

工作正常,但通过错误数据库是空的

  

转换为值类型 'System.Int32' 失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。

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

4 个答案:

答案 0 :(得分:7)

试试这个

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`

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

对于任何因为价格不能为空而出现问题的人,但where子句返回的是空集,您可以将价格强制为可为空,然后将空合并检查移到外部:

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

答案 3 :(得分:0)

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

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