Dapper列到F#选项属性

Kas*_*man 3 f# optional dapper

如何让Dapper将数据转换为带有option属性的F#类型?简单的例子:

type SomeType = {
    Count : int option
}

connection.QueryAsync<SomeType>(...)
Run Code Online (Sandbox Code Playgroud)

抛出:

System.InvalidOperationException
    A parameterless default constructor or one matching signature
    (System.Int32 count) is required for SomeType materialization
Run Code Online (Sandbox Code Playgroud)

使用Nullable而不是选项工作:

type SomeType = {
    Count : Nullable<int>
}
Run Code Online (Sandbox Code Playgroud)

但由于各种原因,它并不理想.首先,我有我使用的情况string option(因为F#通常不允许空分配,这很好),并且Nullable<string>不编译.有没有办法配置/指示Dapper自动处理option类型?我想避免每次都使用自定义映射.

如果重要,请使用Npgsql.

Cha*_*ger 6

我不认为有任何支持为开放泛型添加处理程序,所以你必须为你需要的每种类型添加一个类型处理程序.

您可以像这样定义一个处理程序:

type OptionHandler<'T>() =
    inherit SqlMapper.TypeHandler<option<'T>>()

    override __.SetValue(param, value) = 
        let valueOrNull = 
            match value with
            | Some x -> box x
            | None -> null

        param.Value <- valueOrNull    

    override __.Parse value =
        if isNull value || value = box DBNull.Value 
        then None
        else Some (value :?> 'T)
Run Code Online (Sandbox Code Playgroud)

并注册您需要的类型,如下所示:

SqlMapper.AddTypeHandler (OptionHandler<string>())
SqlMapper.AddTypeHandler (OptionHandler<int>())
Run Code Online (Sandbox Code Playgroud)