Entity Framework / SQL Server странное поведение десятичного деления - PullRequest
3 голосов
/ 14 октября 2011

У меня есть таблица в базе данных 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?
...