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
, float
enzovoort. 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}")