2015-12-23 17 views
7

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 
+0

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

+0

@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

+0

İ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

cevap

0

açıkça bir veri ek açıklama

[Column(TypeName = "decimal(5,2)")] 
public decimal MyDecimal { get; set; } 
kullanılarak ondalık alanın sütun türü, hem de hassas ve ölçeği tanımlar

EF, here'u kullanırken geçerli olan varsayılan LINQ'dan SQL'e CLR türü eşleştirmeleri bulabilirsiniz.

T-SQL sayısal ve ondalık veri türleri hakkında bilgi edinin here.