EF4.1 и F #: как обращаться со значениями - PullRequest
1 голос
/ 27 июля 2011

Я создал приложение 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 во время выполнения.Но во время компиляции F # компилятор ожидает, что результат никогда не будет null , поэтому я не могу выполнить проверку шаблона вокруг null ( цена, когда цена <> нуль ).

Что мне здесь не хватает?Есть ли правильный способ сделать это?

Ответы [ 3 ]

2 голосов
/ 27 июля 2011

Вы можете проверить равенство Unchecked.defaultof<_> вместо нуля.

1 голос
/ 27 июля 2011

Вы можете сделать

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
1 голос
/ 27 июля 2011

Не могли бы вы сделать нулевую проверку внутри предложения WHERE? as (r.Program <> null && r.Program = request.Program). Я предполагаю, что есть проблема в ГДЕ, чем в том, как F # интерпретирует ее.

-Fahad

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...