У меня есть таблица в базе данных SQL Server 2008 R2, которая включает два столбца с десятичными значениями (16,6). Давайте назовем их column1 и column2.
Когда я пытаюсь выполнить запрос Linq для сущности, сгенерированной из этой таблицы:
Table.Select(r => new Foo
{
Bar = (r.Column1 + r.Column2) / 2m
}
);
Я получаю System.OverflowException , если column1 + column2> = 15846. Сообщение об исключении только:
Преобразование переполнено.
С небольшим количеством проб и ошибок мне удалось заставить запрос работать со следующим:
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
}
);
... выдает то же исключение преобразования (со значением 20000 в Column1
).
- Почему эти два запроса SQL приводят к двум различным числам цифр?
- И почему первое число не может быть преобразовано в
decimal
с помощью EF?