2012-04-17 29 views
2

我在執行下面的查詢時總結了一個不可空的十進制數字時出錯。當位置/組織組合沒有量值時,幅度爲零。這是在查詢中對十進制值類型進行求和的最佳方式嗎?

let q = query { from m in Measure do 
        where (locations.Contains(m.Location) 
         && organizations.Contains(m.Organization)) 
        sumBy m.Magnitude } 

錯誤:無法將null值分配給System.Decimal類型爲非空值類型的成員。

我用下面的方法解決了這個問題。這是否有更好的方法來做到這一點?

let convert (n:Nullable<decimal>) = 
     let c:decimal = 0M 
     if n.HasValue then n.Value else c 

let q = query { from m in Measure do 
        let nullable = Nullable<decimal>(m.Magnitude) 
        where (locations.Contains(m.Location) 
         && organizations.Contains(m.Organization)) 
        sumBy (convert(nullable)) } 

謝謝。我改變了我的查詢以下。

query { for m in db.Measurement do 
       let nullable = Nullable<decimal>(m.Magnitude) 
       where (m.Measure = me 
         && (if slice.Organization > 0L then organizationUnits.Contains(m.PrimalOrganizationUnit.Value) else true) 
         && (if slice.Location > 0L then locationUnits.Contains(m.PrimalLocationUnit.Value) else true)) 
       sumByNullable (nullable) } 

回答

3

這是一個LINQ-to-SQL問題(但是是由設計決定的,因爲在SQL中總結一個空列的結果爲NULL,請參閱here),而不是特定於F#。您的解決方法似乎與鏈接的MSDN論壇主題中的建議相匹配。

相關問題