Operatory dopuszczane do wartości null w zapytaniach

Operatory dopuszczające wartość null to operatory arytmetyczne binarne lub operatory porównania, które działają z typami arytmetycznymi dopuszczającym wartość null po jednej lub obu stronach. Typy dopuszczające wartość null pojawiają się podczas pracy z danymi ze źródeł, takich jak bazy danych, które zezwalają na wartości null zamiast rzeczywistych wartości. Operatory dopuszczane do wartości null są używane w wyrażeniach zapytań. Oprócz operatorów dopuszczania wartości null dla arytmetyki i porównania operatory konwersji mogą służyć do konwertowania między typami dopuszczającym wartość null. Istnieją również wersje dopuszczane do wartości null niektórych operatorów zapytań.

Uwaga

Operatory dopuszczane do wartości null są zwykle używane tylko w wyrażeniach zapytań. Jeśli nie używasz wyrażeń zapytania, nie musisz wiedzieć ani używać tych operatorów.

Tabela operatorów dopuszczania wartości null

W poniższej tabeli wymieniono operatory dopuszczane do wartości null obsługiwane w języku F#.

Wartość null po lewej stronie Wartość null po prawej stronie Obie strony dopuszczają wartość null
?>= >=? ?>=?
?> >? ?>?
?<= <=? ?<=?
?< <? ?<?
?= =? ?=?
?<> <>? ?<>?
?+ +? ?+?
?- -? ?-?
?* *? ?*?
?/ /? ?/?
?% %? ?%?

Uwagi

Operatory dopuszczane do wartości null są zawarte w module NullableOperators w przestrzeni nazw FSharp.Linq. Typ danych dopuszczanych do wartości null to System.Nullable<'T>.

W wyrażeniach zapytania występują typy dopuszczające wartość null podczas wybierania danych ze źródła danych, które zezwalają na wartości null zamiast wartości. W bazie danych programu SQL Server każda kolumna danych w tabeli ma atrybut wskazujący, czy wartości null są dozwolone. Jeśli wartości null są dozwolone, dane zwrócone z bazy danych mogą zawierać wartości null, które nie mogą być reprezentowane przez typ danych pierwotnych, takich jak int, floati tak dalej. W związku z tym dane są zwracane jako System.Nullable<int> zamiast int, a System.Nullable<float> nie float. Wartość rzeczywistą można uzyskać z System.Nullable<'T> obiektu przy użyciu Value właściwości i można określić, czy System.Nullable<'T> obiekt ma wartość, wywołując metodę HasValue . Inną przydatną System.Nullable<'T>.GetValueOrDefault metodą jest metoda, która umożliwia uzyskanie wartości lub wartości domyślnej odpowiedniego typu. Wartość domyślna to pewna forma wartości "zero", na przykład 0, 0,0 lub false.

Typy dopuszczane do wartości null mogą być konwertowane na typy pierwotne bez wartości null przy użyciu zwykłych operatorów konwersji, takich jak int lub float. Istnieje również możliwość konwersji z jednego typu dopuszczalnego wartości null do innego typu dopuszczanego do wartości null przy użyciu operatorów konwersji dla typów dopuszczanych do wartości null. Odpowiednie operatory konwersji mają taką samą nazwę jak standardowe, ale znajdują się w osobnym module, module dopuszczalnym wartości null w przestrzeni nazw FSharp.Linq . Zazwyczaj ta przestrzeń nazw jest otwierana podczas pracy z wyrażeniami zapytania. W takim przypadku można użyć operatorów konwersji dopuszczających wartość null, dodając prefiks Nullable. do odpowiedniego operatora konwersji, jak pokazano w poniższym kodzie.

open Microsoft.FSharp.Linq

let nullableInt = new System.Nullable<int>(10)

// Use the Nullable.float conversion operator to convert from one nullable type to another nullable type.
let nullableFloat = Nullable.float nullableInt

// Use the regular non-nullable float operator to convert to a non-nullable float.
printfn $"%f{float nullableFloat}"

Wynik to 10.000000.

Operatory zapytań w polach danych dopuszczających wartość null, takie jak sumByNullable, również istnieją do użycia w wyrażeniach zapytań. Operatory zapytań dla typów niezwiązanych z wartościami null nie są zgodne z typami dopuszczanymi do wartości null, dlatego podczas pracy z wartościami danych dopuszczanymi wartościami null należy używać wersji dopuszczanej do wartości null. Aby uzyskać więcej informacji, zobacz Wyrażenia zapytań.

W poniższym przykładzie pokazano użycie operatorów dopuszczanych do wartości null w wyrażeniu zapytania języka F#. Pierwsze zapytanie pokazuje, jak napisać zapytanie bez operatora dopuszczalnego wartości null; drugie zapytanie pokazuje równoważne zapytanie, które używa operatora dopuszczalnego wartości null. Aby uzyskać pełny kontekst, w tym sposób konfigurowania bazy danych do używania tego przykładowego kodu, zobacz Przewodnik: uzyskiwanie dostępu do bazy danych SQL Database przy użyciu dostawców typów.

open System
open System.Data
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Microsoft.FSharp.Linq

[<Generate>]
type dbSchema = SqlDataConnection<"Data Source=MYSERVER\INSTANCE;Initial Catalog=MyDatabase;Integrated Security=SSPI;">

let db = dbSchema.GetDataContext()

query {
    for row in db.Table2 do
    where (row.TestData1.HasValue && row.TestData1.Value > 2)
    select row
} |> Seq.iter (fun row -> printfn $"%d{row.TestData1.Value} %s{row.Name}")

query {
    for row in db.Table2 do
    // Use a nullable operator ?>
    where (row.TestData1 ?> 2)
    select row
} |> Seq.iter (fun row -> printfn "%d{row.TestData1.GetValueOrDefault()} %s{row.Name}")

Zobacz też