实体框架/ SQL Server奇怪的小数除法行为

时间:2011-10-14 15:38:25

标签: sql-server sql-server-2008 entity-framework sql-server-2008-r2

我的SQL server 2008 R2数据库中有一个表,其中包含两个可以为空的十进制(16,6)列。我们称它们为column1和column2。

当我尝试针对从此表生成的实体运行Linq查询时:

Table.Select(r => new Foo
                  {
                     Bar = (r.Column1 + r.Column2) / 2m
                  }
            );

如果column1 + column2> = 15846,我会收到 System.OverflowException 。例外的消息只是:

  

转化次数溢出。

通过一些试验和错误,我设法使查询工作如下:

Table.Select(r => new Foo
                  {
                     Bar = (r.Column1 + r.Column2).HasValue ? 
                         (r.Column1 + r.Column2).Value / 2m : 0
                  }
            ); 

但是,我想知道是否有人能解释初始查询出了什么问题。


修改

第一个查询生成此SQL:

SELECT 
1 AS [C1], 
([Extent1].[Column1] + [Extent1].[Column2]) / cast(2 as decimal(18)) AS [C2]
FROM [dbo].[Table] AS [Extent1]

对于两列的值为10000,在SSMS中手动运行查询,结果为10000.0000000000000000000000000(25个十进制零)。

第二个查询有这个SQL:

SELECT 
1 AS [C1], 
CASE WHEN ([Extent1].[Column1] + [Extent1].[Column2] IS NOT NULL)
     THEN ([Extent1].[Column1] + [Extent1].[Column2]) / cast(2 as decimal(18))
     ELSE cast(0 as decimal(18))
     END AS [C2]
FROM [dbo].[Table] AS [Extent1]

在SSMS中运行查询会返回10000.00000000000000000000(20个十进制零)。显然,当EF尝试将第一个值(带有25个十进制零)转换为十进制但第二个值(带有20个十进制零)时,它会出现问题。

与此同时,结果发现问题也出现在非可空列甚至单个十进制(16,6)列上。以下......

Table.Select(r => new Foo
                  {
                     Bar = r.Column1 / 2m
                  }
            );

...抛出相同的转换异常(Column1中的值为20000)。

  • 为什么这两个SQL查询会产生两个不同的数字?
  • 为什么第一个号码不能被EF转换为decimal

0 个答案:

没有答案