Bagikan melalui


Operator Nullable dalam Kueri

Operator nullable adalah operator aritmatika biner atau perbandingan yang bekerja dengan jenis aritmatika nullable pada satu atau kedua sisi. Jenis yang dapat diubah ke null muncul saat Anda bekerja dengan data dari sumber seperti database yang memungkinkan null menggantikan nilai aktual. Operator yang dapat diubah ke null digunakan dalam ekspresi kueri. Selain operator nullable untuk aritmetika dan perbandingan, operator konversi dapat digunakan untuk mengonversi antara jenis nullable. Ada juga versi nullable dari operator kueri tertentu.

Nota

Operator nullable umumnya hanya digunakan dalam ekspresi kueri. Jika Anda tidak menggunakan ekspresi kueri, Anda tidak perlu mengetahui atau menggunakan operator ini.

Tabel Operator Nullable

Tabel berikut mencantumkan operator nullable yang didukung di F#.

Nullable di sebelah kiri Nullable di sebelah kanan Kedua sisi nullable
Apa yang terjadi?>= >=? Apa yang terjadi?>=?
?> >? ?>?
Apa yang terjadi?<= <=? Apa yang terjadi?<=?
?< <? ?<?
?= =? ?=?
?<> <>? ?<>?
?+ +? ?+?
?- -? ?-?
?* *? ?*?
?/ /? ?/?
?% %? ?%?

Komentar

Operator nullable disertakan dalam modul NullableOperators di namespace FSharp.Linq. Jenis untuk data nullable adalah System.Nullable<'T>.

Dalam ekspresi kueri, jenis nullable muncul saat memilih data dari sumber data yang memungkinkan null alih-alih nilai. Dalam database SQL Server, setiap kolom data dalam tabel memiliki atribut yang menunjukkan apakah null diizinkan. Jika null diizinkan, data yang dikembalikan dari database dapat berisi null yang tidak dapat diwakili oleh jenis data primitif seperti , float, dan sebagainyaint. Oleh karena itu, data dikembalikan sebagai System.Nullable<int> alih-alih int, dan System.Nullable<float> bukan float. Nilai aktual dapat diperoleh dari System.Nullable<'T> objek dengan menggunakan Value properti , dan Anda dapat menentukan apakah System.Nullable<'T> objek memiliki nilai dengan memanggil HasValue metode . Metode lain yang berguna adalah System.Nullable<'T>.GetValueOrDefault metode , yang memungkinkan Anda untuk mendapatkan nilai atau nilai default dari jenis yang sesuai. Nilai default adalah beberapa bentuk nilai "nol", seperti 0, 0,0, atau false.

Jenis nullable dapat dikonversi ke jenis primitif yang tidak dapat diubah ke null menggunakan operator konversi biasa seperti int atau float. Dimungkinkan juga untuk mengonversi dari satu jenis nullable ke jenis nullable lainnya dengan menggunakan operator konversi untuk jenis nullable. Operator konversi yang sesuai memiliki nama yang sama dengan yang standar, tetapi berada dalam modul terpisah, modul Nullable di namespace FSharp.Linq . Biasanya, Anda membuka namespace ini saat bekerja dengan ekspresi kueri. Dalam hal ini, Anda dapat menggunakan operator konversi nullable dengan menambahkan awalan Nullable. ke operator konversi yang sesuai, seperti yang ditunjukkan dalam kode berikut.

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

Outputnya adalah 10.000000.

Operator kueri pada bidang data yang dapat diubah ke null, seperti sumByNullable, juga ada untuk digunakan dalam ekspresi kueri. Operator kueri untuk tipe yang tidak dapat diubah ke null tidak kompatibel dengan tipe yang dapat diubah ke null, jadi Anda harus menggunakan versi operator kueri yang sesuai yang dapat diubah ke null saat Anda bekerja dengan nilai data yang dapat diubah ke null. Untuk informasi selengkapnya, lihat Ekspresi Kueri.

Contoh berikut menunjukkan penggunaan operator yang dapat diubah ke null dalam ekspresi kueri F#. Kueri pertama memperlihatkan bagaimana Anda akan menulis kueri tanpa operator yang dapat diubah ke null; kueri kedua memperlihatkan kueri yang setara yang menggunakan operator yang dapat diubah ke null. Untuk konteks lengkapnya, termasuk cara menyiapkan database untuk menggunakan kode sampel ini, lihat Panduan: Mengakses Database SQL dengan Menggunakan Penyedia Tipe.

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

Lihat juga