Condividi tramite


Operatori nullable nelle query

Gli operatori nullable sono operatori aritmetici o di confronto binari che funzionano con tipi aritmetici nullable su uno o entrambi i lati. I tipi nullable si verificano quando si lavora con dati provenienti da origini, ad esempio database che consentono valori Null al posto dei valori effettivi. Gli operatori nullable vengono usati nelle espressioni di query. Oltre agli operatori nullable per l'aritmetica e il confronto, gli operatori di conversione possono essere usati per eseguire la conversione tra tipi nullable. Esistono anche versioni nullable di determinati operatori di query.

Nota

Gli operatori nullable vengono in genere usati solo nelle espressioni di query. Se non si usano espressioni di query, non è necessario conoscere o usare questi operatori.

Tabella degli operatori nullable

Nella tabella seguente sono elencati gli operatori nullable supportati in F#.

Nullable a sinistra Nullable a destra Entrambi i lati nullable
?>= >=? ?>=?
?> >? ?>?
?<= <=? ?<=?
?< <? ?<?
?= =? ?=?
?<> <>? ?<>?
?+ +? ?+?
?- -? ?-?
?* *? ?*?
?/ /? ?/?
?% %? ?%?

Osservazioni:

Gli operatori nullable sono inclusi nel modulo NullableOperators nello spazio dei nomi FSharp.Linq. Il tipo per i dati nullable è System.Nullable<'T>.

Nelle espressioni di query, i tipi nullable si verificano quando si selezionano dati da un'origine dati che consente valori Null anziché valori. In un database di SQL Server ogni colonna di dati in una tabella ha un attributo che indica se i valori Null sono consentiti. Se sono consentiti valori Null, i dati restituiti dal database possono contenere valori Null che non possono essere rappresentati da un tipo di dati primitivo, ad intesempio , floate così via. Di conseguenza, i dati vengono restituiti come anziché System.Nullable<int>intcome e System.Nullable<float> invece di float. Il valore effettivo può essere ottenuto da un System.Nullable<'T> oggetto usando la Value proprietà ed è possibile determinare se un System.Nullable<'T> oggetto ha un valore chiamando il HasValue metodo . Un altro metodo utile è il System.Nullable<'T>.GetValueOrDefault metodo , che consente di ottenere il valore o un valore predefinito del tipo appropriato. Il valore predefinito è una forma di valore "zero", ad esempio 0, 0,0 o false.

I tipi nullable possono essere convertiti in tipi primitivi non nullable usando gli operatori di conversione consueti, int ad esempio o float. È anche possibile eseguire la conversione da un tipo nullable a un altro tipo nullable usando gli operatori di conversione per i tipi nullable. Gli operatori di conversione appropriati hanno lo stesso nome di quelli standard, ma si trovano in un modulo separato, il modulo Nullable nello spazio dei nomi FSharp.Linq . In genere, questo spazio dei nomi viene aperto quando si utilizzano espressioni di query. In tal caso, è possibile usare gli operatori di conversione nullable aggiungendo il prefisso Nullable. all'operatore di conversione appropriato, come illustrato nel codice seguente.

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

L'output è 10.000000.

Gli operatori di query su campi dati nullable, ad esempio sumByNullable, esistono anche per l'uso nelle espressioni di query. Gli operatori di query per i tipi non nullable non sono compatibili con i tipi nullable, pertanto è necessario usare la versione nullable dell'operatore di query appropriato quando si usano valori di dati nullable. Per altre informazioni, vedere Espressioni di query.

Nell'esempio seguente viene illustrato l'uso di operatori nullable in un'espressione di query F#. La prima query mostra come scrivere una query senza un operatore nullable; La seconda query mostra una query equivalente che usa un operatore nullable. Per il contesto completo, incluso come configurare il database per l'uso di questo codice di esempio, vedere Procedura dettagliata: Accesso a un database SQL tramite provider di tipi.

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

Vedi anche