2

当我执行以下对不可为空的小数求和的查询时,我遇到了一个错误。当位置/组织组合没有幅度值时,幅度为空。

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

错误:无法将 null 值分配给 System.Decimal 类型的成员,该类型是不可为 null 的值类型。

我通过以下方式解决了这个问题。有没有更好的方法来做到这一点?

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

2 回答 2

5

sumByNullable

于 2012-04-17T00:26:12.453 回答
3

这是一个 LINQ-to-SQL 问题(但这是设计使然,因为在 SQL 中对空列求和会导致 NULL,请参见此处),并非特定于 F#。您的解决方法似乎与链接的 MSDN 论坛线程中的建议相匹配。

于 2012-04-17T16:53:48.710 回答