c# – 实体框架十进制舍入在投影中不一致

前端之家收集整理的这篇文章主要介绍了c# – 实体框架十进制舍入在投影中不一致前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在将整数列与十进制值相乘并添加整数列时,EF6在处理舍入方面似乎不一致.
  1. // CREATE TABLE MyTable (MyIntValue INT NOT NULL)
  2. // INSERT INTO MyTable (MyIntValue) VALUES (10)
  3. const int IntScale = 5;
  4. const decimal DecimalScale = 5;
  5. const decimal DecimalScale2 = 5.0m;
  6. context.Set<MyTable>()
  7. .Select(row => new
  8. {
  9. WithFloats = 0.5f + (row.MyIntValue * 5.0f),// 50.5
  10. WithDecimals = 0.5m + (row.MyIntValue * 5.0m),// 51
  11. WithDecimals2 = 0.5m + ((decimal)row.MyIntValue * 5.0m),// 50.5
  12. WithDecimals3 = 0.5m + ((decimal)row.MyIntValue * IntScale),// 51
  13. WithDecimals4 = 0.5m + ((decimal)row.MyIntValue * (decimal)IntScale) // 51
  14. WithDecimals5 = 0.5m + ((decimal)row.MyIntValue * DecimalScale) // 51
  15. WithDecimals6 = 0.5m + ((decimal)row.MyIntValue * DecimalScale2) // 50.5
  16. })
  17. .Single();

当然这不是预期/正确的行为?我希望WithDecimals值为50.5(而不是51).我忽略了简单的事情吗?如何在不更改其他常量类型的情况下确保WithoutDecimals不会被舍入?

为WithFloats和WithDecimals(分别)生成sql

  1. ,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

解决方法

通过使用数据注释显式定义列类型以及十进制字段的精度和小数位数
  1. [Column(TypeName = "decimal(5,2)")]
  2. public decimal MyDecimal { get; set; }

您可以找到默认的LINQ-to-sql CLR类型映射,适用于使用EF,here时.

阅读T-sql数字和十进制数据类型here.

猜你在找的C#相关文章