Linq to sql LINQ到SQL-十进制数据类型被截断而不是四舍五入

Linq to sql LINQ到SQL-十进制数据类型被截断而不是四舍五入,linq-to-sql,Linq To Sql,我有一个十进制的DB列(6,1) 使用LINQ将记录保存到SQL时,它会截断该值,而不是舍入 例如,如果在生成的LINQ to SQL查询中传递给此列的参数具有此值。。。 --@p1:输入小数(大小=0;预处理=6;刻度=1)[222.259] 数据将在数据库中显示为222.2,而不是222.3 然后,如果我将DB中的同一列更改为decimal(7,2),并且不重新生成LINQ到SQL类,那么使用LINQ保存记录仍然会截断。。。 --@p1:输入小数(大小=0;预处理=6;刻度=1)[222.2

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

例如,如果在生成的LINQ to SQL查询中传递给此列的参数具有此值。。。 --@p1:输入小数(大小=0;预处理=6;刻度=1)[222.259] 数据将在数据库中显示为222.2,而不是222.3

然后,如果我将DB中的同一列更改为decimal(7,2),并且不重新生成LINQ到SQL类,那么使用LINQ保存记录仍然会截断。。。 --@p1:输入小数(大小=0;预处理=6;刻度=1)[222.259] 数据将在数据库中显示为222.20,而不是222.26(或222.30)

有人知道这是否是LINQ的正确行为吗?还是SqlServer提供程序?它的行为与在mgmtstudio中手工编写查询的方式不同,这就是为什么我不明白为什么它是截断而不是舍入

mgmt studio中的以下查询。。。 更新表格集DecimalColumn=222.259 当列为十进制(6,1)时,将val设置为222.3;当列为十进制(7,2)时,将val设置为222.26


谢谢

您是否尝试过使用DataContext.Log从LINQ查询中提取原始SQL?如果您通过ManagementStudio手动执行查询时该查询有效,则提供程序可能会截断查询中的值。一篇关于如何获取原始SQL的文章。 您可能还需要检查.dlinq文件中是否正确表示了列的类型


你的问题。。小型web eh?

这是sqlparameter,它必须这样做,因为分数舍入是不标准的:有不同类型的舍入算法,用于不同的领域,比如银行业使用不同的舍入标准

如果要舍入,请在实体中设置值之前通过舍入值来定义舍入。它是合乎逻辑的,因为您将一个位数定义为scale,所以.256不能放在一个位数中,这意味着您要么应该得到一个异常(linq to sql不支持内存内验证),要么在较低的级别被截断

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

namespace your.namespace.in.here
{
    class foobarEntityConfiguration : EntityTypeConfiguration<foobarEntity>
    {
        public foobarEntityConfiguration()
        {
            this.Property(x => x.foobarPropertyBeingTruncated)
                .HasPrecision(18, 5);
        }
    }
}
namespace.your.namespace.in.here
{
类FooberEntityConfiguration:EntityTypeConfiguration
{
公共食品实体配置()
{
this.Property(x=>x.foobarPropertyBeingTruncated)
.精确性(18,5);
}
}
}
由于LINQ/EF有此缺陷,并且作为一般规则,我发现在显示时间之前保持尽可能高的精度是一件好事。让表示层根据需要进行任何舍入/截断。然后,如果在SQL或report builder中有一个后LINQ导出计算,那么以您的货币表示的便士更有可能匹配


注意,在我的例子中,由于没有明显的原因,LINQ之前被截断为小数点后2位。根据文档,LINQ/EF是根据小数的精度来决定的。

是的,我对生成的sql进行了一系列测试,结果只有在通过LINQ时才发生。我想我已经不再在这上面浪费时间了-我只是将col db类型改为float,精度至关重要。我的意思是“精度不重要”