C# LINQ求和法误差
下面的C# LINQ求和法误差,c#,sql-server,asp.net-mvc,linq,asp.net-core,C#,Sql Server,Asp.net Mvc,Linq,Asp.net Core,下面的LINQ查询给出了如下所示的错误: 错误: 无法将“System.Double”类型的对象强制转换为“System.Nullable”类型的“1[System.Single]” LINQ查询: using (gEn myEntities = new gEn) { var load = (from items in myEntities.Orders select items.PayO).Sum(); } Public class Order { Public in
LINQ
查询给出了如下所示的错误:
错误:
无法将“System.Double”类型的对象强制转换为“System.Nullable”类型的“1[System.Single]”
LINQ查询:
using (gEn myEntities = new gEn)
{
var load = (from items in myEntities.Orders
select items.PayO).Sum();
}
Public class Order
{
Public int OrdersId {get; set;}
Public float? PayO {get; set;}
}
型号:
using (gEn myEntities = new gEn)
{
var load = (from items in myEntities.Orders
select items.PayO).Sum();
}
Public class Order
{
Public int OrdersId {get; set;}
Public float? PayO {get; set;}
}
注意:
real
,其所有值都大于零(如果这很重要)select2
替换selectitems.PayO,那么LINQ
查询工作正常,并返回重复次数为表中行数的2的总和。例如,如果表有4行,LINQ
查询将返回8
(即2+2+2+2)从我在代码中看到的。 PayO是可以为null的,错误明确表示它不能将null转换为double。 所以你需要更新你的查询
using (gEn myEntities = new gEn)
{
var load = (from items in myEntities.Orders
where items.PayO != NULL
select items.PayO).Sum();
}
我怀疑(目前无法证明)您在查询具体化方面存在问题
执行此查询时:
var load = (from items in myEntities.Orders
select items.PayO).Sum();
SELECT SUM(PayO) FROM Order;
它将被转换为此查询:
var load = (from items in myEntities.Orders
select items.PayO).Sum();
SELECT SUM(PayO) FROM Order;
此时,您的查询无法处理null
值
但当你这样做时(我在上面的评论中提到):
您的查询将被执行,并且您的内存中将有一个float?
列表。此时可以执行聚合,因为Sum()
null
值
var load = pays.Sum();
load
是您的总和。根本无法复制此值-该代码不会根据您的声明引发该错误。此异常与sum()
无关!它与数据库的映射gEn
有关。您可以进行以下查询:(从myEntities.Orders中的项目选择items.PayO)。ToList()
,然后查看发生了什么?结果是什么?您将在以浮点类型存储货币时遇到问题。阅读:。在存储货币的小数部分(例如,美分)时,有许多值无法用浮点数精确表示。当谈到会计时,这种不精确性会累积起来,让你头疼。Net和SqlServer都有十进制数据类型,EF将正确映射这些数据类型。十进制是货币的适当类型。不使用它可能会很痛苦。我怀疑这是因为您首先将集合具体化为内存中的集合,因此值现在是float?
,并且您对集合中的值求和,而不是通过sql查询(即double
)对数据库中的原始值求和正如我在上面的注释1中提到的,所有值都不可为空(即>0)。但是,我认为您和用户@StephenMuecke
在上面怀疑的是,您建议的解决方案(有效)可能与执行ToList()
时的内存列表有关。感谢您为这个问题的可能原因及其可行的解决方案提供一些线索。