データベースから一意のアイテムを取得する場合、クライアントから提供された ID のデータがない場合のシナリオに対応する必要があります。たとえば、ID が正しくないか、キャッシュされたデータの有効期限が切れています。
この例で使用している特定の DB クライアント ライブラリは ServiceStack.Redis ですが、原則はどの CLR ライブラリにも当てはまると思います。
以下に示すレコード タイプを使用してデータ構造を定義しました。現在、クライアント ライブラリを使用してデータベースに存在しないキーのデータを取得すると、null
値が返されます。これは、私は期待し、満足しています。問題は、実行時に発生する可能性があるにもかかわらず、F# コンパイラがこのシナリオのパターン マッチを許可しないことです。
type MyRecordType = { id:int; name:string; desc:string }
let redis = new RedisClient("localhost")
let nullCheck =
let item = redis.Get<MyRecordType> "xxx"
// it is possible that item is null
// but the compiler will not permit the match
match item with
| null -> None
| _ -> Some item
Redis クライアント ライブラリには、ブール値を返す 'ContainsKey' メソッドが含まれています。これを最初に使用できますが、ここではデータベースへの 2 つの呼び出しは不要です。もう 1 つの方法は、C# プロジェクトで定義されたクラスをデータ構造として使用することですが、これにはオーバーヘッドがかかりすぎます。この属性は、 での一致も許可しませんnull
。
非常に一般的な問題のように思われるため、このシナリオに対処するために使用する規則を知りたいですか?