获取分组记录时,记录不会以十进制精度丢失

时间:2015-09-29 11:53:19

标签: c# sql-server linq-to-sql

我们有一个使用Linq to SQL的项目。分组后,不会从与组密钥相关的表中选择记录。运行探查器有助于发现检索记录时添加的条件对十进制字段的精度较低。解决方案是什么?

var  groupedSO = from so in db.SalesOrders
                 orderby so.BizDate, so.POSID ascending
                 where SalesOrders.Contains(so.POSID)                                                
                 group so by 
                 new
                 {
                     so.BizDate.Value.Date,                                                      
                     so.CurrRateMultp, //Decimal: Value in DB is 0.33333333                                                        
                 }
                 into grps
                 select grps;

当我们遍历群组时,

 foreach (var orders in groupedSO)
  {
    foreach (var order in orders)
      {
        //No records available
      }
  }

它使用类似于

的SQL选择记录
select <Fields> 
from Table 
where CONVERT(DATE, [t0].[bizdate])  = @P0 AND  @x4 = [t0].[currratemultp]

但在生成的SQL中@ x4 = 0.3333 的值,而在DB中,值 0.33333333

这会导致记录无法重试。

该字段以简单的方式映射

[Column]
public decimal? CurrRateMultp { get; set; }

SQL中的字段类型是

decimal(19, 8)

请帮助添加精确度所需的更改。

1 个答案:

答案 0 :(得分:0)

感谢所有检查过的人,

我明白了。 DbType有一个命名参数ColumnAttribute。即使微软网站说

  

使用此属性指定定义列的确切文本   Transact-SQL表声明。 仅在时指定DbType属性   您打算使用CreateDatabase创建数据库实例。   DbType的默认值是从成员类型推断出来的。更多   信息,请参阅SQL-CLR类型映射。

将其设置为SQL类型有助于我获得精度。 所以,我宣布我的财产为

 [Column(DbType = "decimal(19, 8)")]     
 public decimal? CurrRateMultp { get; set; }

这使SQL生成了小数位数。 谢谢大家!希望这也有助于其他人。