EF6, ondalık değerlere sahip tamsayı sütunları ile çarparken ve yuvarlarken yuvarlamayı nasıl ele aldığı konusunda tutarsız görünmektedir.Entity Framework ondalık yuvarlama, projeksiyonda tutarsız
// CREATE TABLE MyTable (MyIntValue INT NOT NULL)
// INSERT INTO MyTable (MyIntValue) VALUES (10)
const int IntScale = 5;
const decimal DecimalScale = 5;
const decimal DecimalScale2 = 5.0m;
context.Set<MyTable>()
.Select(row => new
{
WithFloats = 0.5f + (row.MyIntValue * 5.0f), // 50.5
WithDecimals = 0.5m + (row.MyIntValue * 5.0m), // 51
WithDecimals2 = 0.5m + ((decimal)row.MyIntValue * 5.0m), // 50.5
WithDecimals3 = 0.5m + ((decimal)row.MyIntValue * IntScale), // 51
WithDecimals4 = 0.5m + ((decimal)row.MyIntValue * (decimal)IntScale) // 51
WithDecimals5 = 0.5m + ((decimal)row.MyIntValue * DecimalScale) // 51
WithDecimals6 = 0.5m + ((decimal)row.MyIntValue * DecimalScale2) // 50.5
})
.Single();
Elbette bu beklenen/doğru davranış değil midir? WithDecimals değerinin 50.5 olmasını (51 değil) beklerim. Basit bir şeye mi bakıyordum? Diğer sabitlerin türünü değiştirmeden, AsDecimals'ın yuvarlanmadığından nasıl emin olabilirim?
(sırasıyla) WithFloats ve WithDecimals için oluşturulan SQL:
,CAST(0.5 AS REAL) + (CAST(MyIntValue AS REAL) * CAST(5 AS REAL)) AS WithFloats
,0.5 + (CAST(MyIntValue AS DECIMAL(19,0)) * CAST(5 AS DECIMAL(18))) AS WithDecimals
EF, System.Decimal to DECIMAL (18, 0) varsayılan değerlerle eşleştirir, böylece WithDecimals değeriniz en yakın tam sayıya yuvarlanır. Bu varsayılan davranışı değiştirmenin bir yolu olduğuna inanıyorum, bkz. Bu yorum: http://stackoverflow.com/a/27418286/189572 – Max
@Max: Bir varsayılan ondalık kesinlik eklenmesi etkisiz görünüyor. Ayrıca, başka bir yansıtılmış sütun ekleyecekseniz: (0.5m + row.MyIntValue) sonuç 10.5 olur, bu nedenle davranış varsayılan bir ondalık kesinlik nedeniyle görünmüyordu. – mindlessgoods
İlginç. DECIMAL (19,0), satırın cast.MyIntValue sorun gibi görünüyor, DECIMAL (18) bir döküm ile çalışır. C# 'da ondalık sayıya dönüştürdüğünüzde ne olur? '' 'WithDecimals = 0,5m + ((ondalık) satır.MyIntValue * 5.0m)' '' – Max