Dzoukr / Dapper.FSharp

Lightweight F# extension for StackOverflow Dapper with support for MSSQL, MySQL, PostgreSQL, and SQLite
MIT License
365 stars 35 forks source link

Adding pipeline API? #86

Open eagle-k opened 1 year ago

eagle-k commented 1 year ago

This is a proposal to add a new API to this library. When using plain Dapper, it would be useful to be able to pass CommandText, Parameters, etc. through the pipeline.
The following is an example code.

[<CLIMutable>]
type Customer = { Id: int; Name: string }

task {
    use connection = // ...
    do! connection.OpenAsync(cts.Token)

    return!
        "select Id, Name from Customer where ID = @ID"
        |> CommandDef.create
        |> CommandDef.withParameters {| ID = 42 |}
        |> CommandDef.withCancellationToken cts.Token
        |> connection.QuerySingleAsync<Customer>
}

It would be great to see Dapper.FSharp support the F# idiomatic pipeline API for plain Dapper cases.

Prototype: https://github.com/eagle-k/Dapper.FSharp.Pipeline

This prototype also includes support for F# Async. F# Async should come in handy when dealing with CancellationToken.

Dzoukr commented 1 year ago

Hi @eagle-k,

I like this approach, but I am not sure how it will work with the current LINQ-like API (mainly based on computation expressions). I think this should be a separated project not necessarily based on Dapper.FSharp? 🤔