这是在查询中对十进制值类型进行求和的最佳方式吗?

问题描述:

我在执行下面的查询时总结了一个不可空的十进制数字时出错。当位置/组织组合没有量值时,幅度为零。这是在查询中对十进制值类型进行求和的最佳方式吗?

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) } 

这是一个LINQ-to-SQL问题(但是是由设计决定的,因为在SQL中总结一个空列的结果为NULL,请参阅here),而不是特定于F#。您的解决方法似乎与链接的MSDN论坛主题中的建议相匹配。