クエリ内の Null 許容の演算子

Null 許容の演算子は、一辺または両辺で Null 許容の算術演算型を使用する二項算術または比較演算子です。 Null 許容型は、実際の値の代わりに null 値を許容するデータベースなどのソースからのデータを操作するときに発生します。 クエリ式では、Null 許容の演算子が使用されます。 算術演算と比較用の Null 許容演算子に加えて、変換演算子を使用して Null 許容型間で変換を行うこともできます。 特定のクエリ演算子の Null 許容バージョンもあります。

注意

一般に、Null 許容の演算子はクエリ式内でのみ使用されます。 クエリ式を使用しない場合は、これらの演算子を知る必要も使う必要もありません。

Null 許容演算子の表

次の表に、F# でサポートされている Null 許容の演算子を示します。

左に Null 許容 右に Null 許容 両辺で Null 許容
?>= >=? ?>=?
?> >? ?>?
?<= <=? ?<=?
?< <? ?<?
?= =? ?=?
?<> <>? ?<>?
?+ +? ?+?
?- -? ?-?
?* *? ?*?
?/ /? ?/?
?% %? ?%?

解説

Null 許容の演算子は、名前空間 FSharp.LinqNullableOperators モジュールに含まれています。 Null 許容データの型は System.Nullable<'T> です。

クエリ式では、Null 許容型は、値ではなく null 値を許容するデータ ソースからデータを選択するときに発生します。 SQL Server データベースでは、テーブル内の各データ列に、null 値が許容されるかどうかを示す属性があります。 null 値が許容される場合、データベースから返されるデータには、intfloat などのプリミティブ データ型では表現できない null 値が含まれることがあります。 したがって、データは int ではなく System.Nullable<int>float ではなく System.Nullable<float> として返されます。 実際の値は、Value プロパティを使用して System.Nullable<'T> オブジェクトから取得できます。また、HasValue メソッドを呼び出すことによって、System.Nullable<'T> オブジェクトに値があるかどうかを判断できます。 もう 1 つの便利なメソッドとして、System.Nullable<'T>.GetValueOrDefault メソッドがあります。これを使用すると、適切な型の値または既定値を取得できます。 既定値は、0、0.0 や false のような "ゼロ" 値の形式です。

Null 許容型は、intfloat などの通常の変換演算子を使用して Null 非許容のプリミティブ型に変換できます。 Null 許容型に対して変換演算子を使用することにより、1 つの Null 許容型から別の Null 許容型に変換することもできます。 適切な変換演算子は、標準のものと同じ名前ですが、別のモジュール (FSharp.Linq 名前空間の Nullable モジュール) 内にあります。 通常は、クエリ式を操作するときに、この名前空間を開きます。 その場合は、次のコードに示すように、適切な変換演算子にプレフィックス Nullable. を追加することによって、Null 許容の変換演算子を使用できます。

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

出力は 10.000000 になります。

クエリ式で使用するために、sumByNullable などの Null 許容のデータ フィールドに対するクエリ演算子も存在します。 Null 非許容型のクエリ演算子は、Null 許容型との型互換性がないため、Null 許容のデータ値を操作する場合は、適切なクエリ演算子の Null 許容バージョンを使用する必要があります。 詳細については、「クエリ式」を参照してください。

次の例では、F# クエリ式で Null 許容の演算子を使用する方法を示します。 最初のクエリは、Null 許容の演算子を使用せずにクエリを記述する方法を示しています。2 番目のクエリは、Null 許容の演算子を使用する同等のクエリを示しています。 このサンプル コードを使用するようにデータベースを設定する方法など、完全なコンテキストについては、チュートリアル: 型プロバイダーを使用した SQL データベースへのアクセスに関する記事を参照してください。

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

関連項目