MVC linq to sql 总和

MVC linq to sql sum

尝试根据字段的总和获取从数据库返回的值。

但是收到这条消息:

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

数据库不包含该用户当天的记录是有效的,因此我选择了可​​为空的路线。在过去的美好时光里,我会构建一个带有 `ISNULL` 的存储过程!!!

这是我的基本表达:

decimal? foodCount = dbContext.fad_userFoods.Where(uf => uf.dateAdded == thisDate && uf.userID == thisGuid).Sum(uf=>(decimal?)uf.quantityAmount ?? 0m);

谷歌搜索得出了可空定义和 ?? 的使用。 "m" 是十进制的。但是错误仍然存​​在!

你们的集体帮助将一如既往地宝贵。提前致谢。

使用 Convert.ToDecimal(),这将处理您的 null 问题。

decimal foodCount = dbContext.fad_userFoods.Where(uf => uf.dateAdded == thisDate 
                                                     && uf.userID == thisGuid)
                                           .Sum(uf=> Convert.ToDecimal(uf.quantityAmount ?? 0m));

LINQ to Entities does not recognize the method 'System.Decimal ToDecimal(System.Decimal)' method, and this method cannot be translated into a store expression.

编辑:

decimal foodCount = dbContext.fad_userFoods.Where(uf => uf.dateAdded == thisDate 
                                                     && uf.userID == thisGuid)
                                           .Sum(uf=> { decimal result;
                                                       decimal.TryParse(uf.quantityAmount,out result); 
                                                       return result;});

因为它是 sum 而不是 average 你真的不介意 null-values 吗? 为什么不直接删除 null-values?

    decimal? foodCount = dbContext.fad_userFoods
      .Where(uf => 
         uf.dateAdded == thisDate && 
         uf.userID == thisGuid && 
         uf.quantityAmount != null)
      .Sum(uf=> uf.quantityAmount);

使用DefaultIfEmpty方法。如果找不到任何值,这将填充 0。

decimal foodCount = dbContext.fad_userFoods
    .Where(uf => uf.dateAdded == thisDate && uf.userID == thisGuid)
    .Select(uf => uf.quantityAmount)
    .DefaultIfEmpty()
    .Sum();

混淆源于 LINQ To Entities 中的 Sum 与 LINQ To Objects 中的处理方式略有不同。尽管从声明来看,在 decimal 上调用它看起来会 return 0,但当目标集为空时,实际上 SQL SUM 函数 return s NULL,即使目标列不可为空。

一旦你知道了,有两种方法可以解决它。

假设我们有一个 table 和 decimal 列,原始表达式是

table.Sum(item => item.Column)

第一种方法是使用 :

中包含的模式进行转换
table.Select(item => item.Column).DefaultIfEmpty().Sum()

第二种方法是在函数内部将不可空类型显式转换为可空类型,然后将 null-coalescing operator 应用于 result:

table.Sum(item => (decimal?)item.Column) ?? 0

两种方法都有效,并且产生相同的结果,因此请使用更适合您个人喜好的一种。

为了完整起见,在您的案例中应用第二种方法基本上是将 ?? 0 移到 Sum 调用之外:

decimal foodCount = dbContext.fad_userFoods
    .Where(uf => uf.dateAdded == thisDate && uf.userID == thisGuid)
    .Sum(uf => (decimal?)uf.quantityAmount) ?? 0;