Delen via


Null-operatoren in query's

Null-operatoren zijn binaire rekenkundige of vergelijkingsoperatoren die werken met null-rekenkundige typen aan een of beide zijden. Null-typen ontstaan wanneer u werkt met gegevens uit bronnen zoals databases die null-waarden toestaan in plaats van werkelijke waarden. Null-operatoren worden gebruikt in query-expressies. Naast null-operatoren voor rekenkundige en vergelijkingen kunnen conversieoperators worden gebruikt om te converteren tussen null-typen. Er zijn ook null-versies van bepaalde queryoperators.

Notitie

Null-operatoren worden over het algemeen alleen gebruikt in query-expressies. Als u geen query-expressies gebruikt, hoeft u deze operators niet te kennen of te gebruiken.

Tabel met null-operatoren

De volgende tabel bevat null-operators die worden ondersteund in F#.

Null-waarde aan de linkerkant Null-waarde rechts Beide zijden nullable
?>= >=? ?>=?
?> >? ?>?
?<= <=? ?<=?
?< <? ?<?
?= =? ?=?
?<> <>? ?<>?
?+ +? ?+?
?- -? ?-?
?* *? ?*?
?/ /? ?/?
?% %? ?%?

Opmerkingen

De operatoren die null kunnen worden gebruikt, zijn opgenomen in de module NullableOperators in de naamruimte FSharp.Linq. Het type voor null-gegevens is System.Nullable<'T>.

In query-expressies ontstaan null-typen bij het selecteren van gegevens uit een gegevensbron die null-waarden toestaat in plaats van waarden. In een SQL Server-database heeft elke gegevenskolom in een tabel een kenmerk dat aangeeft of null-waarden zijn toegestaan. Als null-waarden zijn toegestaan, kunnen de gegevens die worden geretourneerd uit de database null-waarden bevatten die niet kunnen worden weergegeven door een primitief gegevenstype, zoals int, floatenzovoort. Daarom worden de gegevens geretourneerd als een System.Nullable<int> in plaats van int, en System.Nullable<float> in plaats van float. De werkelijke waarde kan worden verkregen uit een System.Nullable<'T> object met behulp van de Value eigenschap en u kunt bepalen of een System.Nullable<'T> object een waarde heeft door de methode aan te HasValue roepen. Een andere handige methode is de System.Nullable<'T>.GetValueOrDefault methode, waarmee u de waarde of een standaardwaarde van het juiste type kunt ophalen. De standaardwaarde is een vorm van nulwaarde, zoals 0, 0,0 of false.

Null-typen kunnen worden geconverteerd naar niet-null-primitieve typen met behulp van de gebruikelijke conversieoperators zoals int of float. Het is ook mogelijk om van het ene type null naar een ander null-type te converteren met behulp van de conversieoperators voor null-typen. De juiste conversieoperators hebben dezelfde naam als de standaardoperators, maar bevinden zich in een afzonderlijke module, de Nullable-module in de FSharp.Linq-naamruimte . Normaal gesproken opent u deze naamruimte wanneer u met query-expressies werkt. In dat geval kunt u de operatoren voor null-conversie gebruiken door het voorvoegsel Nullable. toe te voegen aan de juiste conversieoperator, zoals wordt weergegeven in de volgende code.

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

De uitvoer is 10.000000.

Queryoperators voor null-gegevensvelden, zoals sumByNullable, bestaan ook voor gebruik in query-expressies. De queryoperators voor niet-nulleerbare typen zijn niet typecompatibel met null-typen, dus u moet de null-versie van de juiste queryoperator gebruiken wanneer u werkt met null-gegevenswaarden. Zie Query-expressies voor meer informatie.

In het volgende voorbeeld ziet u het gebruik van null-operatoren in een F#-queryexpressie. De eerste query laat zien hoe u een query schrijft zonder een null-operator; de tweede query toont een equivalente query die gebruikmaakt van een null-operator. Zie Walkthrough voor de volledige context, waaronder het instellen van de database voor het gebruik van deze voorbeeldcode : Toegang tot een SQL-database met behulp van typeproviders.

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

Zie ook