我只是不能解决这个问题,我正在尝试根据下面的条件对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。
发布于 2012-01-26 22:06:07
在第一种情况下,对数据库执行sum。在后一种情况下,sum是在内存中的客户端.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。在你的第一个版本中,你是用指定的PAN对所有TOTALS实例求和。所以,这就是为什么我必须稍微小心,只说看起来你在数据库上溢出了,但我们不能确定。
发布于 2012-01-26 22:12:38
如果您确定该值适合小数,则应检查Oracle数据库上的日志。Sum()操作在它上面执行,所以这可能是原因,溢出是在您的数据库上引起的,而不是由.NET框架引起的。
发布于 2012-01-26 22:12:49
我猜您的数据库中有多个e.PAN == "2600000246696"和/或多个e.PAN == "2600000246701"
第一个查询是从数据库中获取所有行,并给出总和。在Oracle中是可以的(不会溢出)。将是一个很大的数字(不适合小数)。
最后两个查询的第一行和第二行各占一行。
https://stackoverflow.com/questions/9019244
复制相似问题