Sdílet prostřednictvím


Operátory s možnou hodnotou null v dotazech

Operátory s možnou hodnotou null jsou binární aritmetické operátory nebo relační operátory, které pracují s aritmetickými typy na jedné nebo obou stranách. Typy s možnou hodnotou null vznikají, když pracujete s daty ze zdrojů, jako jsou databáze, které umožňují hodnoty null místo skutečných hodnot. Operátory s možnou hodnotou null se používají ve výrazech dotazu. Kromě operátorů s možnou hodnotou null pro aritmetické a porovnání lze převodní operátory použít k převodu mezi typy s možnou hodnotou null. Existují také verze s možnou hodnotou null některých operátorů dotazu.

Poznámka:

Operátory s možnou hodnotou null se obecně používají pouze ve výrazech dotazu. Pokud nepoužíváte výrazy dotazu, nemusíte tyto operátory znát ani používat.

Tabulka operátorů s možnou hodnotou Null

Následující tabulka uvádí operátory s možnou hodnotou null podporované v jazyce F#.

Nullable na levé straně Nullable on right Obě strany s možnou hodnotou null
?>= >=? ?>=?
?> >? ?>?
?<= <=? ?<=?
?< <? ?<?
?= =? ?=?
?<> <>? ?<>?
?+ +? ?+?
?- -? ?-?
?* *? ?*?
?/ /? ?/?
?% %? ?%?

Poznámky

Operátory s možnou hodnotou null jsou zahrnuty v modulu NullableOperators v oboru názvů FSharp.Linq. Typ pro data s možnou hodnotou null je System.Nullable<'T>.

Ve výrazech dotazu vznikají typy s možnou hodnotou null při výběru dat ze zdroje dat, který umožňuje hodnoty null místo hodnot. V databázi SQL Serveru má každý sloupec dat v tabulce atribut, který označuje, jestli jsou povoleny hodnoty null. Pokud jsou povoleny hodnoty null, mohou data vrácená z databáze obsahovat hodnoty null, které nelze reprezentovat primitivním datovým typem, například int, floatatd. Proto jsou data vrácena jako System.Nullable<int> místo int, a System.Nullable<float> nikoli float. Skutečnou hodnotu lze získat z objektu System.Nullable<'T> pomocí Value vlastnosti a můžete určit, zda System.Nullable<'T> objekt má hodnotu voláním HasValue metody. Další užitečnou metodou System.Nullable<'T>.GetValueOrDefault je metoda, která umožňuje získat hodnotu nebo výchozí hodnotu příslušného typu. Výchozí hodnota je nějaká forma nulové hodnoty, například 0, 0,0 nebo false.

Typy s možnou hodnotou null mohou být převedeny na nenulové primitivní typy pomocí obvyklých převodních operátorů, například int nebo float. Je také možné převést z jednoho typu s možnou hodnotou null na jiný typ s možnou hodnotou null pomocí operátorů převodu pro typy s možnou hodnotou null. Příslušné operátory převodu mají stejný název jako standardní operátory, ale jsou v samostatném modulu, který je možné použít v oboru názvů FSharp.Linq . Tento obor názvů obvykle otevřete při práci s výrazy dotazu. V takovém případě můžete použít operátory převodu s možnou hodnotou null přidáním předpony Nullable. k příslušnému operátoru převodu, jak je znázorněno v následujícím kódu.

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}"

Výstup je 10.000000.

Operátory dotazu na datová pole s možnou hodnotou null, například sumByNullableexistují také pro použití ve výrazech dotazu. Operátory dotazu pro typy bez hodnoty null nejsou kompatibilní s typy s možnou hodnotou null, takže při práci s hodnotami dat s možnou hodnotou null je nutné použít verzi příslušného operátoru dotazu s možnou hodnotou null. Další informace naleznete v tématu Výrazy dotazu.

Následující příklad ukazuje použití operátorů s možnou hodnotou null ve výrazu dotazu jazyka F#. První dotaz ukazuje, jak byste napsali dotaz bez operátoru s možnou hodnotou null; Druhý dotaz zobrazí ekvivalentní dotaz, který používá operátor s možnou hodnotou null. Úplný kontext, včetně toho, jak nastavit databázi tak, aby používala tento ukázkový kód, najdete v tématu Návod: Přístup k databázi SQL pomocí zprostředkovatelů typů.

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

Viz také