2017-05-30 5 views
1

APIからデータをロードしていますが、特定のフィールドの値はNULLです。データ(オブジェクト)をリストにロードした後、リスト全体を反復して、SQLProviderを使用して各オブジェクトをデータベースに格納します。F#SQLProvider - フィールドにNULL値を代入する

for x in myList do 
    let item = db.Dbo.Item.Create() 
    item.Name <- x.Name 
    item.Description <- x.Description // Description might be NULL 

db.SubmitUpdates() 

ただし、すべてのクエリパラメータ値が提供されないというエラーが表示されて失敗します。

これを回避するには以下のようにしますが、多くの列があるテーブルでは面倒です。

if x.Description |> isNull |> not then 
    item.Description <- x.Description 

このヌルチェックを回避する方法はありますか?

+0

ここでは配管が少し過剰だと思います。 'そうでなければ(isNull xx)then(doSomething with xx)'は目では簡単です。しかし、あなたが試みることのできるアプローチのいくつかは、1. filter myListにnull xが含まれないようにします。2. SQLproviderを使用する場合、Optionalsオプションをオンにしてみてください。/None、次にList.chooseを選択して、Some値をフィルタリングしてマップすることができます。 – s952163

+1

@ s952163フィルタリングは実際には受け入れられません。私は何十もの列を扱っており、それらのほとんどはnull可能である可能性があります。いくつかの列に値が存在しない場合は有効なシナリオであり、ソース・フィールドからターゲットDB列にデータを取得するだけで済みます。 – Anil

+0

他の質問に記載されている 'useOpTypes = true'パラメータが役に立つかもしれません。私は多くのデータをヌル可能な列にロードします。どのように扱うかは、どこから来るのか、データが実際にヌル可能であれば '.GetValueOrDefault()'を使うことができるので、 'x.Description.GetValueOrDefault()' onそれには 'Uncheked.defaultof <_>'もあります。理想的には、それはDTOの世話をするでしょう。 – s952163

答えて

2

F#とSQL型プロバイダは、Nullableの代わりにOptionを使用しようとします。
私は通常NullをNoneに変換し、ある値に値を変換する小さな関数を持っています。
詳細については、FSharp for fun and profitを参照してください。

関連する問題