Nullable-Operatoren in Abfragen

Nullable-Operatoren sind binäre Arithmetik- oder Vergleichsoperatoren, die mit arithmetischen Nullable-Typen auf einer oder beiden Seiten funktionieren. Nullable-Typen entstehen, wenn Sie mit Daten aus Quellen wie Datenbanken arbeiten, die Nullwerte anstelle von tatsächlichen Werten zulassen. Nullable-Operatoren werden in Abfrageausdrücken verwendet. Zusätzlich zu Nullable-Operatoren für Arithmetik und Vergleich können Konvertierungsoperatoren verwendet werden, um zwischen Nullable-Typen zu konvertieren. Es gibt auch Nullable-Versionen bestimmter Abfrageoperatoren.

Hinweis

Nullable-Operatoren werden in der Regel nur in Abfrageausdrücken verwendet. Wenn Sie keine Abfrageausdrücke verwenden, müssen Sie diese Operatoren nicht kennen oder verwenden.

Tabelle von Nullable-Operatoren

In der folgenden Tabelle sind Nullable-Operatoren aufgeführt, die in F# unterstützt werden.

Nullwerte links Nullwerte rechts Nullwerte auf beiden Seiten möglich
?>= >=? ?>=?
?> >? ?>?
?<= <=? ?<=?
?< <? ?<?
?= =? ?=?
?<> <>? ?<>?
?+ +? ?+?
?- -? ?-?
?* *? ?*?
?/ /? ?/?
?% %? ?%?

Bemerkungen

Die Nullable-Operatoren sind im NullableOperators-Modul im Namespace FSharp.Linq enthalten. Der Typ für Nullable-Daten ist System.Nullable<'T>.

In Abfrageausdrücken entstehen Nullable-Typen, wenn Daten aus einer Datenquelle ausgewählt werden, die Nullwerte anstelle von Werten zulässt. In einer SQL Server-Datenbank verfügt jede Datenspalte in einer Tabelle über ein Attribut, das angibt, ob Nullwerte zulässig sind. Wenn Nullwerte zulässig sind, können die von der Datenbank zurückgegebenen Daten Nullwerte enthalten, die nicht durch einen primitiven Datentyp wie int, float usw. dargestellt werden können. Daher werden die Daten als System.Nullable<int> anstelle von int und System.Nullable<float> anstelle von float zurückgegeben. Der tatsächliche Wert kann mithilfe der System.Nullable<'T>-Eigenschaft aus einem Value-Objekt abgerufen werden, und Sie können bestimmen, ob ein System.Nullable<'T>-Objekt über einen Wert verfügt, indem Sie die HasValue-Methode aufrufen. Eine weitere nützliche Methode ist die System.Nullable<'T>.GetValueOrDefault-Methode, mit der Sie den Wert oder einen Standardwert des entsprechenden Typs abrufen können. Der Standardwert ist eine Form des Nullwerts, z. B. 0, 0,0 oder false.

Nullable-Typen können mithilfe der üblichen Konvertierungsoperatoren wie int oder float in primitive Non-Nullable-Typen konvertiert werden. Es ist auch möglich, von einem Nullable-Typ in einen anderen Nullable-Typ zu konvertieren, indem die Konvertierungsoperatoren für Nullable-Typen verwendet werden. Die entsprechenden Konvertierungsoperatoren haben den gleichen Namen wie die Standardoperatoren, befinden sich jedoch in einem separaten Modul, dem Nullable-Modul im FSharp.Linq-Namespace. In der Regel öffnen Sie diesen Namespace, wenn Sie mit Abfrageausdrücken arbeiten. In diesem Fall können Sie die Nullable-Konvertierungsoperatoren verwenden, indem Sie das Präfix Nullable. dem entsprechenden Konvertierungsoperator hinzufügen, wie im folgenden Code gezeigt.

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

Die Ausgabe lautet 10.000000.

Abfrageoperatoren für Nullable-Datenfelder, z. B. sumByNullable, sind ebenfalls für die Verwendung in Abfrageausdrücken vorhanden. Die Abfrageoperatoren für Non-Nullable-Typen sind nicht typkompatibel mit Nullable-Typen. Daher müssen Sie die Nullable-Version des entsprechenden Abfrageoperators verwenden, wenn Sie mit Nullable-Datenwerten arbeiten. Weitere Informationen finden Sie unter Abfrageausdrücke.

Das folgende Beispiel zeigt die Verwendung von Nullable-Operatoren in einem F#-Abfrageausdruck. Die erste Abfrage zeigt, wie Sie eine Abfrage ohne Nullable-Operator schreiben würden. Die zweite Abfrage zeigt eine entsprechende Abfrage, die einen Nullable-Operator verwendet. Den vollständigen Kontext, einschließlich der Einrichtung der Datenbank für die Verwendung dieses Beispielcodes, finden Sie unter Exemplarische Vorgehensweise: Zugreifen auf eine SQL-Datenbank mithilfe von Typanbietern.

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

Siehe auch