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

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


但是,如果我将条件分为两个单独的查询,则可以正常工作:

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


该值显然适合小数,并且我看不到为什么会进行任何缩小的转换。

我正在使用带有Oracle后端的Entity Framework。

最佳答案

在第一种情况下,总和在数据库上执行。在后一种情况下,总和在.NET的客户端内存中执行。我怀疑您在数据库上溢出。由于您没有告诉我们数据库中的数据类型以及PAN是否是TOTALS的唯一标识符,因此我们没有足够的信息可以肯定地得出结论,但这绝对是我关注的重点注意第一。

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

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


其中的AsEnumerable强制Sum在内存中计算。没有它,Sum将在数据库上执行。在后一种情况下,您知道将收到溢出异常。在前一种情况下,我怀疑您不会。如果是这样,则说明问题出在数据库之一。

此外,请注意,代码的第二个版本不一定与代码的第一个版本相同。尽管PAN是否是唯一标识符,您都没有告诉我们,尽管看上去确实如此。如果不是,则在第二种情况下,您仅下拉一个TOTALS实例,该实例的PAN等于给定的每个PAN。在第一个版本中,您要对所有具有指定TOTALSPAN实例求和。因此,这就是为什么我必须稍微小心一点,只说它看起来像数据库上溢出了,但是我们不能肯定地说。

关于c# - 十进制算术溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9019244/

10-09 18:18