十进制算术溢出

m.e*_*son 3 .net c# linq oracle entity-framework

我根本无法解决这个问题,我试图根据下面的条件求和TOTAL的值,这会导致ArithmeticOverflow:

var rawData = (from e in Context.TOTALS
                where (e.PAN == "2600000246701" || e.PAN == "2600000246696")
                select e.TOTAL).Sum();
Run Code Online (Sandbox Code Playgroud)

但是,如果我将条件分成两个单独的查询,它可以工作:

var rawData1 = (from e in Context.TOTALS
                where (e.PAN == "2600000246696")
                select e.TOTAL).FirstOrDefault();

var rawData2 = (from e in Context.TOTALS
                 where (e.PAN == "2600000246701")
                 select e.TOTAL).FirstOrDefault();

decimal? output = rawData1 + rawData2; //output is 696768.0186M
Run Code Online (Sandbox Code Playgroud)

该值明显符合小数,我不明白为什么会有任何缩小的转换.

我正在使用Entity Framework和Oracle后端.

jas*_*son 5

在第一种情况下,总和在数据库上执行.在后一种情况下,总和在.NET的内存(客户端)中执行.我怀疑你在数据库上溢出来了.由于您没有告诉我们数据库中的数据类型以及是否PAN是唯一的标识符TOTALS,我们没有足够的信息来确定这一点,但这绝对是我首先关注的地方.

编辑:这是一种看待差异的方法.将您的代码重写为

var rawData = (from e in Context.TOTALS
               where (e.PAN == "2600000246701" || e.PAN == "2600000246696")
               select e.TOTAL
              ).AsEnumerable()
               .Sum();
Run Code Online (Sandbox Code Playgroud)

AsEnumerable有强制的Sum在内存计算.没有它,Sum就会在数据库上执行.在后一种情况下,您知道您正在获得溢出异常.在前一种情况下,我怀疑你不会.如果是这样,这说明问题就是数据库.

另请注意,代码的第二个版本不一定等同于代码的第一个版本.你没有告诉我们,虽然看起来确实如此,但是否PAN是唯一的标识符.如果不是,在第二种情况下,你只拉下一个实例的TOTALS具有PAN等于每个给定的PAN秒.在第一个版本中,您将TOTALS使用指定的PANs 对所有实例进行求和.所以,这就是为什么我必须要小心谨慎,只是说它看起来像是在数据库中溢出但我们无法确定.