我已经构建了一个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 )。
我在这里缺少什么?有没有正确的方法来做到这一点?
答案 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