Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ求和法误差_C#_Sql Server_Asp.net Mvc_Linq_Asp.net Core - Fatal编程技术网

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;}
}
注意

  • SQL Server 2012中相应订单表的PayO列的类型为
    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()
    时的内存列表有关。感谢您为这个问题的可能原因及其可行的解决方案提供一些线索。