F # 옵션 속성에 대한 Dapper 열

dapper f# optional

문제

Dapper가 option 속성을 사용하여 F # 형식으로 데이터를 변환하려면 어떻게해야합니까? 간단한 예 :

type SomeType = {
    Count : int option
}

connection.QueryAsync<SomeType>(...)

이것은 던졌습니다 :

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

옵션 대신 Nullable 사용 :

type SomeType = {
    Count : Nullable<int>
}

그러나 그것은 여러 가지 이유로 바람직하지 않습니다. 우선, string option 사용하는 경우가 있는데 (F #이 null 할당을 정상적으로 허용하지 않기 때문에), Nullable<string> 이 컴파일되지 않습니다. option 유형을 자동으로 처리하도록 Dapper를 구성 / 지시하는 방법이 있습니까? 매번 사용자 지정 매핑을 사용하지 않으려합니다.

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)

다음과 같이 필요한 유형을 등록하십시오.

SqlMapper.AddTypeHandler (OptionHandler<string>())
SqlMapper.AddTypeHandler (OptionHandler<int>())


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow