次の方法で共有


クエリの Null 許容演算子

Null 許容演算子は、2 項算術演算子または比較演算子であり、一方または両側で 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> オブジェクトから取得できます。また、System.Nullable<'T> オブジェクトが値を持っているかどうかを判断するには、HasValue メソッドを呼び出します。 もう 1 つの便利な方法は、 System.Nullable<'T>.GetValueOrDefault メソッドです。これにより、適切な型の値または既定値を取得できます。 既定値は、0、0.0、 falseなど、何らかの形式の "ゼロ" 値です。

null 許容型は、 intfloatなどの通常の変換演算子を使用して、null 非許容プリミティブ型に変換できます。 null 許容型の変換演算子を使用して、ある null 許容型から別の null 許容型に変換することもできます。 適切な変換演算子の名前は標準の演算子と同じですが、FSharp.Linq 名前空間の Null 許容モジュールという別のモジュールに含まれています。 通常、クエリ式を使用するときは、この名前空間を開きます。 その場合は、次のコードに示すように、適切な変換演算子にプレフィックス 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 Database へのアクセス」を参照してください。

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

こちらも参照ください