Null 許容の演算子 (F#)
1 個の null 許容の数値型を使用すると両側で null 許容の演算子が二項演算または比較演算子。 Null 許容型は実際の値の代わりに null 値を許可するデータベースなどのデータ ソースを使用する際に発生します。 null 許容の演算子はクエリ式でよく使用されます。 操作および比較の null 許容型の演算子に加えNull 許容型の間で変換を行うに変換演算子を使用できます。 また特定のクエリ演算子の Null 許容バージョンがあります。
null 許容の演算子の一覧
次の表にF# 言語でサポートされる null 許容の演算子の一覧を示します。
左の Null 許容 |
アクセス許可の Null 許容 |
両側の Null 許容 |
解説
null 許容の演算子は名前空間 Microsoft.FSharp.Linq の NullableOperators のモジュールに含まれています。 null 許容のデータの型は Nullable です。
クエリ式ではnull 許容型はデータ ソースのデータを選択するとnull 値を許可する値の代わりに発生します。 SQL Server データベースではテーブルのデータ列に null 値を許可するかどうかを示す属性があります。 null 値が許可されるとデータベースから返されたデータ int はfloat などのプリミティブ型で表すことができない null を含めることができます。 したがってデータは int の代わりに System.Nullable<int>float の代わりに System.Nullable<float> として返されます。 実際には Nullable のオブジェクトから Value のプロパティを使用して取得 Nullable のオブジェクトに HasValue のメソッドを呼び出すことによって値が存在するかどうかを確認できます。 別の便利なメソッドは適切な型の既定値または値を取得できるようにする GetValueOrDefault のメソッドです。 既定値は 「 Zero " のフォーム 00.0または false などの値です。
Null 許容型はint または float などの通常の変換演算子を使用して null 非許容のプリミティブ型に変換される場合があります。 null 許容型の変換演算子を使用して1 種類の null 許容型の null 許容型に変換することもできます。 適切な変換演算子に標準のものと同じ名前になりますが別のモジュールMicrosoft.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 になります。
null 許容のデータ フィールドのクエリ演算子はsumByNullable などクエリ式で使用するために存在します。 非許容型のクエリ演算子はNull 許容型と型の互換性がないためnull 許容のデータ値を使用する場合適切なクエリ演算子の Null 許容バージョンを使用する必要があります。 詳細については、「クエリ式 (F#)」を参照してください。
次の例ではF# のクエリ式で null 許容の演算子の使用例を次に示します。 最初のクエリではnull 許容の演算子を使用せずにクエリを記述する方法を示しています ; 2 番目のクエリはnull 許容の演算子を使用する同等のクエリを示しています。 完全なコンテキストではデータベースが含まれます。このコード例を使用するように設定する方法を チュートリアル : 型プロバイダーを使用した SQL データベースへのアクセス (F#) を参照してください。
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 %s" row.TestData1.Value 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 %s" (row.TestData1.GetValueOrDefault()) row.Name)