2015-09-29 29 views
0

我们使用LINQ to SQL项目小数精度丢失。分组后,不会从与组密钥相关的表中选择记录。运行分析器有助于发现在检索记录时添加的条件对于小数字段的精度较低。这是什么解决方案?记录不retriving当得到分组的记录

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] 

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

这会导致记录无法回复。

该字段以简单的方式

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

映射到SQL字段类型是

decimal(19, 8) 

请帮忙更改所需添加什么精度。

+0

您可以使用decimal.Round(数,3),或在查询 –

+0

类似的东西在哪里x4'来自那些被分配到'@价值?在通过groups_进行回环时创建该SQL的代码在哪里?此外,数据库中的CurrRateMultp列的确切类型是什么? – juharr

+0

检查数据库以查看类型是什么。它看起来像数据库是一个双和C#是一个单一的,没有任何意义。 C#十进制类型是96位。所以我怀疑数据库是一个nvar(这是一个字符串),并且有一个从字符串到网络库中的界面中单个的转换。 – jdweng

回答

0

感谢所有这些检查过,

我想通了。没有为ColumnAttribute命名参数DbType。尽管Microsoft网站上说

使用此属性可以指定确切的文本,该文本定义了Transact-SQL表声明的 中的列。 只有 您计划使用的CreateDatabase创建数据库实例指定DbType属性。 DbType的默认值是从成员类型中推断出来的。有关更多 信息,请参阅SQL-CLR类型映射。

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

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

这使SQL生成带有小数的仪式数量。 谢谢大家!希望这可以帮助别人。