EF4.1和F#:如何处理值

时间:2011-07-27 15:41:37

标签: entity-framework f#

我已经构建了一个F#应用程序,现在我正在使用EF4.1(代码优先)作为数据存储。我偶然发现了一个关于打字的奇怪问题。

采取以下片段:

                let result = context
                                .SearchResults
                                .Where((fun (r:SearchResult) -> 
                                        r.Program = request.Program))
                                .OrderByDescending((fun r -> r.AcquisitionDate))
                                .FirstOrDefault()
                match result with
                    | price -> 
                        cacheProvider.Set(result)
                        Some(price)
                    | _ ->
                        ignore(context.SearchRequests.Add(request))
                        ignore(context.SaveChanges())
                        None

当搜索结果不存在时,.FirstOrDefault()调用返回null。因此 result 在运行时绑定到 null 。但是在编译时,F#编译器期望结果永远不会 null 所以我不能围绕 null 进行模式检查(价格当价格<> null )。

我在这里缺少什么?有没有正确的方法来做到这一点?

3 个答案:

答案 0 :(得分:2)

您可以针对Unchecked.defaultof<_>而不是null来测试相等性。

答案 1 :(得分:1)

你能在WHERE子句中进行空检查吗? as(r.Program&lt;&gt; null&amp;&amp; r.Program = request.Program)。我假设WHERE中存在问题而不是F#解释它的问题。

-Fahad

答案 2 :(得分:1)

你可以做到

let result = context
                    .SearchResults
                    .Where((fun (r:SearchResult) -> 
                            r.Program = request.Program))
                    .OrderByDescending((fun r -> r.AcquisitionDate))
                    .Take(1).ToList()
    match result.Length with
        | 1 -> 
            cacheProvider.Set(result.[0])
            Some(result.[0])
        | _ ->
            ignore(context.SearchRequests.Add(request))
            ignore(context.SaveChanges())
            None