【问题标题】:F# SQLProvider - Assign NULL values to fieldsF# SQLProvider - 为字段分配 NULL 值
【发布时间】: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&lt;_&gt;。理想情况下,它会在 DTO 中得到处理。
  • 有多少行?为每条记录执行单独的 INSERT 命令可能会损害性能LOT。它会比批量插入或INSERT VALUES 操作慢 N 倍,尤其是对于少量记录
  • @PanagiotisKanavos 记录数不大 - 否则我会使用 DataTable/SqlBulkInsert。在这种情况下,我更喜欢优雅、可读的代码。

标签: database f# type-providers


【解决方案1】:

F# 和 SQL 类型提供程序尝试使用 Option 而不是 Nullable。
我通常有一个小函数可以将 Null 转换为 None 并将 value 转换为 Some 值。
有关该主题的更多详细信息,请参阅FSharp for fun and profit

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 2011-03-02
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多