【发布时间】:2017-05-30 07:52:41
【问题描述】:
我正在从 API 加载数据,其中某些字段具有 NULL 值 - 这是预期的。将数据(对象)加载到列表中后,我将遍历列表并将每个对象存储到数据库中,使用 SQLProvider。
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
有没有办法避免这种空检查?
【问题讨论】:
-
我认为这里的管道有点过分,例如
if not (isNull xx) then (doSomething with xx)在眼睛上更容易。但是,您可以尝试的一些方法是 1. 过滤 myList 使其中没有 null x,2. 如果您使用 SQLprovider,您可以尝试打开 use Optionals 选项,这样您就可以处理 Some /None,然后您可以 List.choose 例如过滤和映射 Some 值。 -
@s952163 过滤掉是不可接受的。我正在处理几十个列,其中大多数都可以为空。某些列中不存在值是有效的情况,我应该能够简单地将数据从源字段获取到目标数据库列中,而无需任何检查。
-
也许另一个问题中提到的
useOpTypes = true参数可能会对您有所帮助。我将很多数据加载到可空列中,你如何处理它取决于它来自哪里,如果数据实际上可以为空你可以使用.GetValueOrDefault(),所以x.Description.GetValueOrDefault()上面还有Uncheked.defaultof<_>。理想情况下,它会在 DTO 中得到处理。 -
有多少行?为每条记录执行单独的 INSERT 命令可能会损害性能LOT。它会比批量插入或
INSERT VALUES操作慢 N 倍,尤其是对于少量记录 -
@PanagiotisKanavos 记录数不大 - 否则我会使用 DataTable/SqlBulkInsert。在这种情况下,我更喜欢优雅、可读的代码。
标签: database f# type-providers