加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:53:03 所属栏目:百科 来源:网络整理
导读:在将整数列与十进制值相乘并添加整数列时,EF6在处理舍入方面似乎不一致. // CREATE TABLE MyTable (MyIntValue INT NOT NULL)// INSERT INTO MyTable (MyIntValue) VALUES (10)const int IntScale = 5;const decimal DecimalScale = 5;const decimal Decimal
在将整数列与十进制值相乘并添加整数列时,EF6在处理舍入方面似乎不一致.
// 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();

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

为WithFloats和WithDecimals(分别)生成的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

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读