2015-09-29 30 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生成帶有小數的儀式數量。 謝謝大家!希望這可以幫助別人。