我根本无法解决这个问题,根据以下条件,我试图对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
。在第一个版本中,您要对所有具有指定TOTALS
的PAN
实例求和。因此,这就是为什么我必须稍微小心一点,只说它看起来像数据库上溢出了,但是我们不能肯定地说。关于c# - 十进制算术溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9019244/