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;
尝试根据字段的总和获取从数据库返回的值。
但是收到这条消息:
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;