2017-05-30 52 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