Sorgularda Null Atanabilir İşleçler

Null atanabilir işleçler, bir veya her iki tarafta null atanabilir aritmetik türlerle çalışan ikili aritmetik veya karşılaştırma işleçleridir. Null atanabilir türler, veritabanları gibi gerçek değerler yerine null değerlere izin veren kaynaklardan verilerle çalıştığınızda ortaya çıkar. Sorgu ifadelerinde null atanabilir işleçler kullanılır. Aritmetik ve karşılaştırma için null atanabilir işleçlere ek olarak, dönüştürme işleçleri null atanabilir türler arasında dönüştürme yapmak için kullanılabilir. Ayrıca bazı sorgu işleçlerinin null atanabilir sürümleri de vardır.

Not

Null atanabilir işleçler genellikle yalnızca sorgu ifadelerinde kullanılır. Sorgu ifadeleri kullanmıyorsanız, bu işleçleri bilmeniz veya kullanmanız gerekmez.

Null Atanabilir İşleçler Tablosu

Aşağıdaki tabloda F# dilinde desteklenen null atanabilir işleçler listelenmektedir.

Solda boş değer atanabilir Sağda boş değer atanabilir her iki taraf da boş değer atanabilir
Ne demek?>= >=? Ne demek?>=?
?> >? ?>?
Ne demek?<= <=? Ne demek?<=?
?< <? ?<?
?= =? ?=?
?<> <>? ?<>?
?+ +? ?+?
?- -? ?-?
?* *? ?*?
?/ /? ?/?
?% %? ?%?

Açıklamalar

Null atanabilir işleçler, FSharp.Linq ad alanının NullableOperators modülüne eklenir. Boş değer atanabilir verilerin türü şeklindedir System.Nullable<'T>.

Sorgu ifadelerinde, değer yerine null değere izin veren bir veri kaynağından veri seçildiğinde null atanabilir türler ortaya çıkar. SQL Server veritabanında, bir tablodaki her veri sütununda null değerlerin izin verilip verilmeyeceğini gösteren bir öznitelik bulunur. Null değerlere izin verilirse, veritabanından döndürülen veriler , floatgibi intilkel bir veri türüyle temsil edilemeyen null değerler içerebilir. Bu nedenle, veriler yerine intSystem.Nullable<float> ve yerine floatolarak System.Nullable<int> döndürülür. Gerçek değer özelliği kullanılarak Value bir System.Nullable<'T> nesneden alınabilir ve yöntemini çağırarak HasValue bir System.Nullable<'T> nesnenin değeri olup olmadığını belirleyebilirsiniz. Başka bir yararlı yöntem, uygun türün değerini veya varsayılan değerini almanıza olanak tanıyan yöntemdir System.Nullable<'T>.GetValueOrDefault . Varsayılan değer 0, 0,0 veya falsegibi bir "sıfır" değeri biçimidir.

Null atanabilir türler, veya floatgibi int normal dönüştürme işleçleri kullanılarak null atanamaz ilkel türlere dönüştürülebilir. Boş değer atanabilir türler için dönüştürme işleçlerini kullanarak bir null atanabilir türden başka bir null atanabilir türe dönüştürmek de mümkündür. Uygun dönüştürme işleçleri standart işleçlerle aynı ada sahiptir, ancak FSharp.Linq ad alanında Null atanabilir modül olan ayrı bir modüldedir. Genellikle sorgu ifadeleriyle çalışırken bu ad alanını açarsınız. Bu durumda, aşağıdaki kodda gösterildiği gibi ön ekini Nullable. uygun dönüştürme işlecine ekleyerek null atanabilir dönüştürme işleçlerini kullanabilirsiniz.

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

Çıkış 10.000000 olur.

gibi sumByNullablenull atanabilir veri alanlarındaki sorgu işleçleri, sorgu ifadelerinde kullanılmak üzere de mevcuttur. Null değer atanamayan türler için sorgu işleçleri null atanabilir türlerle uyumlu değildir, bu nedenle boş değer atanabilir veri değerleriyle çalışırken uygun sorgu işlecinin null atanabilir sürümünü kullanmanız gerekir. Daha fazla bilgi için bkz . Sorgu İfadeleri.

Aşağıdaki örnekte F# sorgu ifadesinde null atanabilir işleçlerin kullanımı gösterilmektedir. İlk sorgu, null atanabilir işleç olmadan bir sorguyu nasıl yazabileceğinizi gösterir; İkinci sorgu, null atanabilir işleç kullanan eşdeğer bir sorguyu gösterir. Veritabanını bu örnek kodu kullanacak şekilde ayarlama da dahil olmak üzere tüm bağlam için bkz. İzlenecek Yol: Tür Sağlayıcılarını Kullanarak SQL Veritabanı Erişme.

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

Ayrıca bkz.