S možnou hodnotou Null operátory (F#)
S možnou hodnotou Null operátory jsou binární aritmetická a relační operátory, které práci s typy s možnou hodnotou Null aritmetické na jedné nebo obou stranách.S možnou hodnotou Null typy vznikají často pracujete s daty ze zdrojů, jako je například databáze, které povolit hodnoty Null namísto skutečných hodnot.S možnou hodnotou Null operátory se často používají ve výrazech dotazu.Vedle s možnou hodnotou Null operátory pro porovnání a aritmetické operátory převodu lze převést mezi typy s možnou hodnotou Null.Existují také s možnou hodnotou Null verzí některých operátory dotazu.
Tabulka operátorů s možnou hodnotou Null
V následující tabulce jsou uvedeny s možnou hodnotou Null operátory, které jsou podporovány v jazyce F#.
Na levé straně s možnou hodnotou Null |
S možnou hodnotou Null vpravo |
Obě strany s možnou hodnotou Null |
Poznámky
S možnou hodnotou Null operátory jsou součástí NullableOperators modulu v oboru názvů Microsoft.FSharp.Linq.Typ dat s možnou hodnotou NULL je Nullable<T>.
S možnou hodnotou Null typy ve výrazech dotazu, vznikají při výběru data ze zdroje dat, který umožňuje místo hodnot Null.Každý sloupec dat v tabulce v databázi serveru SQL Server má atribut, který označuje, zda jsou povoleny hodnoty Null.Pokud jsou povoleny hodnoty Null, data vrácená z databáze může obsahovat hodnoty Null, které nemohou být zastoupen primitivní datový typ jako int, float, atd.Proto se data vrácena jako System.Nullable<int> namísto int, a System.Nullable<float> namísto float.Skutečné hodnoty lze získat z Nullable<T> objektu pomocí Value vlastnost a můžete určit, zda Nullable<T> objekt má hodnotu voláním HasValue metoda.Další užitečné metodou je GetValueOrDefault metodu, která umožňuje získat hodnotu nebo výchozí hodnotu příslušného typu.Výchozí hodnota je některé formuláře "nula" hodnotu, například 0, 0.0, nebo false.
Typy s možnou hodnotou Null budou převedeny na Structure primitivní typy operátory převodu obvyklým použitím jako int nebo float.Je také možné převést jeden typ s možnou hodnotou Null na jiný typ s možnou hodnotou Null pomocí operátory převodu typů s možnou hodnotou Null.Operátory převodu vhodné mít stejný název jako standardní, ale jsou v samostatných modul s možnou hodnotou Null v modulu Microsoft.FSharp.Linq oboru názvů.Při práci s výrazy dotazu se obvykle otevřete tento obor názvů.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řevedení operátor, 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.
Dotaz u polí s možnou hodnotou Null dat, jako například sumByNullable, existují také pro použití ve výrazech dotazu.Operátory dotazu pro typy Structure nejsou při práci s hodnotami dat s možnou hodnotou NULL je nutné použít s možnou hodnotou Null verze odpovídajícího dotazu operátor kompatibilních s typy s možnou hodnotou Null.Další informace naleznete v tématu Výrazy dotazu (F#).
Následující příklad ukazuje použití s možnou hodnotou Null operátorů ve výrazu dotazu F#.První dotaz zobrazuje, jak píšete dotazu bez s možnou hodnotou Null obsluhy; druhý dotaz zobrazuje ekvivalentní dotaz, který používá s možnou hodnotou Null operátor.Plný kontext, jak nastavit databázi použít tento ukázkový kód včetně viz Názorný postup: Přístup K databázi SQL pomocí zprostředkovatelů typu (F#).
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 %s" row.TestData1.Value 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 %s" (row.TestData1.GetValueOrDefault()) row.Name)