我的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)。
decimal
?