Почему Entity Framework передает параметр в виде DECIMAL (5,0) для столбца, определенного с помощью NUMERIC(19)?


Столбец базы данных определяется как NUMERIC (19) в SQL Server. В , edmx показывает:

<Property Name="supplier_id" Type="numeric" Nullable="false" Precision="19" />

В я вижу это как:

<Property Type="Decimal" Name="supplier_id" Nullable="false" Precision="19" Scale="0" />

В базе данных SELECT с этим столбцом в предложении WHERE проходит через это определение параметра:

(@p__linq__0 decimal(5,0))

Для этого предложения WHERE:

WHERE ([Extent1].[supplier_id] = @p__linq__0)
Я понимаю, что числовые и десятичные числа эквивалентны, но почему точность меняется?
1 2

1 ответ:

(@p__linq__0 decimal(5,0)) является ли точность значения параметра вашим предоставленным.

Например,

decimal number = 12345m;
var result = context.MyTables.Where(x => x.Number == number).ToList();

Тогда запрос будет выглядеть так -

exec sp_executesql N'SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Number] AS [Number]
    FROM [dbo].[MyTable] AS [Extent1]
    WHERE [Extent1].[Number] = @p__linq__0',N'@p__linq__0 decimal(5,0)',
    @p__linq__0=12345

Ответ заключается в том, что оператор SQL не должен быть тем же самым номером точности для, где предложение .

Entity Framework достаточно умна, чтобы вычислить точность числа, и только создает запрос с требуемой точностью.

Примечание: это не относится к Insert и Update; EF создает запрос с та же точность, что и в колонке.