Operatori nullable (F#)
Gli operatori nullable sono aritmetici unari o operatori di confronto utilizzate con i tipi aritmetici nullable in uno o entrambi i lati. I tipi nullable si verificano spesso quando si lavora con i dati provenienti da origini quali database che consentono valori Null anziché valori effettivi. Gli operatori nullable sono spesso utilizzati nelle espressioni di query. Oltre agli operatori nullable per aritmetica e il confronto, gli operatori di conversione possono essere utilizzati per eseguire la conversione tra tipi nullable. Esistono inoltre versioni nullable degli operatori di query sicuri.
Tabella degli operatori nullable
Nella tabella seguente sono elencati gli operatori nullable supportati nel linguaggio F#.
Nullable sulla sinistra |
Nullable sulla destra |
Entrambi i lati nullable |
Note
Gli operatori nullable sono inclusi in NullableOperators modulo nello spazio dei nomi Microsoft.FSharp.Linq. Il tipo di dati è nullable Nullable.
Nelle espressioni di query, i tipi nullable si verificano quando seleziona i dati da un'origine dati che consente valori NULL anziché valori. In un database SQL Server, ogni colonna di dati in una tabella contiene un attributo che indica se i valori Null non sono consentiti. Se i valori Null sono consentiti, i dati restituiti dal database possono contenere valori Null che non può essere rappresentato da un tipo di dati primitivo come int, float, e così via. Di conseguenza, i dati sono restituiti come System.Nullable<int> anziché inte System.Nullable<float> anziché float. Il valore effettivo può essere ottenuto da a Nullable oggetto tramite Value la proprietà ed è possibile determinare se un oggetto Nullable l'oggetto dispone di un valore chiamando HasValue metodo. Un altro metodo utile prevede GetValueOrDefault metodo, che consente di ottenere il valore o un valore predefinito del tipo appropriato. Il valore predefinito è una forma di “zero " valore, come 0, 0,0, o false.
I tipi nullable possono essere convertiti nei tipi primitivi non nullable utilizzando gli operatori usuali di conversione in l int o float. È anche possibile effettuare la conversione da un tipo nullable in un altro tipo nullable utilizzando gli operatori di conversione per i tipi nullable. Gli operatori di conversione appropriati hanno lo stesso nome di tali standard, ma si trovano in un modulo separato, nullable modulo in Microsoft.FSharp.Linq spazio dei nomi. In genere, si apre questo spazio dei nomi quando si utilizzano le espressioni di query. In tal caso, è possibile utilizzare gli operatori nullable di conversione aggiungendo il prefisso Nullable. l'operatore appropriato di conversione, 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.
Operatori di query sui campi dati nullable, ad esempio sumByNullableinoltre, esistere per l'utilizzo nelle espressioni di query. Gli operatori di query per i tipi non nullable non sono tipo-compatibili con tipi nullable, pertanto è necessario utilizzare la versione nullable operatore di query adatto quando si lavora con i valori dei dati nullable. Per ulteriori informazioni, vedere Espressioni di query (F#).
Nell'esempio seguente viene illustrato l'utilizzo degli operatori nullable in un'espressione di query F#. Nella prima procedura viene illustrato query come quella di una query senza un operatore nullable, la seconda query illustrata una query equivalente che utilizza un operatore nullable. Per il contesto completo, incluso come configurare il database per utilizzare questo esempio di codice, vedere Procedura dettagliata: accesso a un database SQL tramite provider di tipi (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)