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
, float
atd. 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 sumByNullable
existují 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}")