2017-05-30 84 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),那麼(用xx做的事情)在眼睛上更容易。然而,你可以嘗試的一些方法是1.過濾myList,使其沒有null x,2.如果你使用SQLprovider,你可以嘗試打開使用Optionals選項,所以你會處理一些/無,然後你可以List.choose例如篩選和映射一些值。 – s952163

+1

@ s952163過濾出來並不是真的可以接受。我正在處理數十列,其中大多數可以是空的。某些列中的值不存在是有效的場景,我應該能夠將源字段中的數據簡單地從任何檢查中獲取到目標DB列中。 – Anil

+0

也許在另一個問題中提到的'useOpTypes = true'參數可能對您有所幫助。我將大量數據加載到可空列中,如何對待它,取決於它來自哪裏,如果數據實際爲空,則可以使用'.GetValueOrDefault()',因此'x.Description.GetValueOrDefault()'on它也有'Uncheked.defaultof <_>'。理想情況下,它將在DTO中處理。 – s952163

回答

2

F#和SQL Type提供程序嘗試使用Option而不是Nullable。
我通常有一個小函數將Null轉換爲None並將值轉換爲Some值。
有關該主題的更多詳細信息,請參閱FSharp for fun and profit