LINQ to SQL - 截断的十进制数据类型而不是舍入

时间:2009-02-20 16:53:09

标签: linq-to-sql

我有一个十进制的DB列(6,1) 使用LINQ to SQL保存记录时,它会截断值而不是舍入。

因此,例如,如果在生成的LINQ to SQL查询中传递给此列的参数具有此值... - @ p1:输入十进制(大小= 0; Prec = 6; Scale = 1)[222.259] 数据将在DB中显示为222.2而不是222.3

然后,如果我将DB中的同一列更改为十进制(7,2)并且我不重新生成LINQ to SQL类,则使用LINQ保存记录仍将截断... - @ p1:输入十进制(大小= 0; Prec = 6; Scale = 1)[222.259] 数据将在DB中显示为222.20而不是222.26(或222.30)

有谁知道这是否是LINQ的正确行为?或者是SqlServer提供商?它与在mgmt studio中手动编写查询的行为方式不同,这就是为什么我对为什么它是截断而不是舍入而感到困惑。

mgmt studio中的以下查询... UPDATE TheTable SET TheDecimalColumn = 222.259 当列为十进制(6,1)时将val设置为222.3,当它为十进制(7,2)时将设置为222.26

由于

3 个答案:

答案 0 :(得分:6)

这是sql参数,它必须这样做,因为舍入分数不是标准化的:有不同类型的舍入算法,它们用于不同类型的区域,例如银行业使用不同类型的舍入标准。

如果要进行舍入,请在设置实体中的值之前通过舍入值来自己定义。这是合乎逻辑的,因为您将单个数字定义为比例,因此.256不适合单个数字,这意味着您应该获得异常(linq to sql不支持内存验证)或者它被截断在较低的水平。

答案 1 :(得分:0)

您是否尝试使用DataContext.Log从LINQ查询中提取原始SQL?如果通过管理工作室手动执行查询时,提供程序可能会截断查询中的值。 Here's一篇关于如何获取原始SQL的文章。 您可能还想检查.dlinq文件中是否正确表示了列的类型。

PS- Found你的问题..小网呃?

答案 2 :(得分:0)

我有同样的问题。 您可以通过向实体添加EntityConfiguration来控制LINQ / EF将数据导出到SQL的精度:

namespace your.namespace.in.here
{
    class foobarEntityConfiguration : EntityTypeConfiguration<foobarEntity>
    {
        public foobarEntityConfiguration()
        {
            this.Property(x => x.foobarPropertyBeingTruncated)
                .HasPrecision(18, 5);
        }
    }
}

由于LINQ / EF有这个错误,并且作为一般规则,我发现尽可能保持精确度,直到显示时间是一件好事。让表示层根据需要进行任何舍入/截断。然后,如果在SQL或报表生成器中有LINQ后导出计算,那么您的货币中的便士更可能匹配。

注意,在我的情况下没有明显的原因,LINQ先前截断了2位小数。根据文档,LINQ / EF根据所讨论的小数的精确度来决定。