クエリ内の Null 許容の演算子
Null 許容の演算子は、一辺または両辺で Null 許容の算術演算型を使用する二項算術または比較演算子です。 Null 許容型は、実際の値の代わりに null 値を許容するデータベースなどのソースからのデータを操作するときに発生します。 クエリ式では、Null 許容の演算子が使用されます。 算術演算と比較用の Null 許容演算子に加えて、変換演算子を使用して Null 許容型間で変換を行うこともできます。 特定のクエリ演算子の Null 許容バージョンもあります。
注意
一般に、Null 許容の演算子はクエリ式内でのみ使用されます。 クエリ式を使用しない場合は、これらの演算子を知る必要も使う必要もありません。
Null 許容演算子の表
次の表に、F# でサポートされている Null 許容の演算子を示します。
左に Null 許容 | 右に Null 許容 | 両辺で Null 許容 |
---|---|---|
?>= | >=? | ?>=? |
?> | >? | ?>? |
?<= | <=? | ?<=? |
?< | <? | ?<? |
?= | =? | ?=? |
?<> | <>? | ?<>? |
?+ | +? | ?+? |
?- | -? | ?-? |
?* | *? | ?*? |
?/ | /? | ?/? |
?% | %? | ?%? |
解説
Null 許容の演算子は、名前空間 FSharp.Linq の NullableOperators モジュールに含まれています。 Null 許容データの型は System.Nullable<'T>
です。
クエリ式では、Null 許容型は、値ではなく null 値を許容するデータ ソースからデータを選択するときに発生します。 SQL Server データベースでは、テーブル内の各データ列に、null 値が許容されるかどうかを示す属性があります。 null 値が許容される場合、データベースから返されるデータには、int
、float
などのプリミティブ データ型では表現できない 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 許容型は、int
や float
などの通常の変換演算子を使用して 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}")
関連項目
.NET