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.
我不认为有任何支持为开放泛型添加处理程序,所以你必须为你需要的每种类型添加一个类型处理程序.
您可以像这样定义一个处理程序:
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)
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |