Megosztás a következőn keresztül:


Null értékű operátorok a lekérdezésekben

A null értékű operátorok bináris aritmetikai vagy összehasonlító operátorok, amelyek null értékű aritmetikai típusokkal dolgoznak egy vagy mindkét oldalon. Null értékű típusok akkor fordulnak elő, ha olyan forrásokból származó adatokkal dolgozik, mint az adatbázisok, amelyek lehetővé teszik a null értéket a tényleges értékek helyett. A lekérdezési kifejezések null értékű operátorokat használnak. Az aritmetikai és összehasonlítási null értékű operátorok mellett konverziós operátorok is használhatók a null értékű típusok közötti konvertáláshoz. Egyes lekérdezési operátorok null értékű verziói is léteznek.

Megjegyzés:

A null értékű operátorokat általában csak lekérdezési kifejezésekben használják. Ha nem használ lekérdezési kifejezéseket, nem kell ismernie és használnia ezeket az operátorokat.

Null értékű operátorok táblázata

Az alábbi táblázat az F#-ban támogatott null értékű operátorokat sorolja fel.

Null értékű bal oldalon Null értékű jobb oldalon Mindkét oldal null értékű
?>= >=? ?>=?
?> >? ?>?
?<= <=? ?<=?
?< <? ?<?
?= =? ?=?
?<> <>? ?<>?
?+ +? ?+?
?- -? ?-?
?* *? ?*?
?/ /? ?/?
?% %? ?%?

Megjegyzések

A null értékű operátorok az FSharp.Linq névtér NullableOperators moduljában találhatók. A null értékű adatok típusa a következő System.Nullable<'T>.

A lekérdezési kifejezésekben null értékű típusok akkor fordulnak elő, ha olyan adatforrásból választanak ki adatokat, amely értékek helyett null értékeket engedélyez. Egy SQL Server-adatbázisban a tábla minden adatoszlopa rendelkezik egy attribútummal, amely jelzi, hogy a null értékek engedélyezettek-e. Ha a null értékek engedélyezettek, az adatbázisból visszaadott adatok tartalmazhatnak olyan null értékeket, amelyeket nem lehet primitív adattípussal ábrázolni, például int: , floatstb. Ezért az adatokat a rendszer ahelyett , és System.Nullable<float> helyette floatadja visszaSystem.Nullable<int>.int A tényleges érték egy System.Nullable<'T> objektumból a tulajdonság használatával Value szerezhető be, és a metódus meghívásával HasValue meghatározhatja, hogy egy System.Nullable<'T> objektum rendelkezik-e értékkel. Egy másik hasznos módszer a System.Nullable<'T>.GetValueOrDefault metódus, amely lehetővé teszi a megfelelő típusú érték vagy alapértelmezett érték lekérését. Az alapértelmezett érték egyfajta "nulla" érték, például 0, 0,0 vagy false.

A null értékű típusok nem null értékű primitív típusokká alakíthatók a szokásos konverziós operátorokkal, például int vagy float. Az egyik null értékű típusról egy másik null értékű típusra is konvertálható a null értékű típusok konverziós operátorainak használatával. A megfelelő konverziós operátorok neve megegyezik a standardokkal, de egy külön modulban, a Nullable modulban találhatók az FSharp.Linq névtérben. Ezt a névteret általában a lekérdezési kifejezések használatakor nyitja meg. Ebben az esetben a null értékű konverziós operátorokat úgy használhatja, hogy hozzáadja az előtagot Nullable. a megfelelő konverziós operátorhoz, ahogyan az az alábbi kódban látható.

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

A kimenet a következő: 10.000000.

A lekérdezési kifejezésekben is léteznek lekérdezési operátorok a null értékű adatmezőkön, például sumByNullablea lekérdezési kifejezésekben. A nem null értékű típusok lekérdezési operátorai nem kompatibilisek a null értékű típusokkal, ezért null értékű adatértékek használatakor a megfelelő lekérdezési operátor null értékű verzióját kell használnia. További információ: Lekérdezési kifejezések.

Az alábbi példa a null értékű operátorok használatát mutatja be egy F#-lekérdezési kifejezésben. Az első lekérdezés bemutatja, hogyan írna egy lekérdezést null értékű operátor nélkül; a második lekérdezés egy null értékű operátort használó egyenértékű lekérdezést jelenít meg. A teljes kontextus, beleértve az adatbázis beállítását a mintakód használatára, lásd : Útmutató: SQL Database elérése típusszolgáltatók használatával.

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

Lásd még