I'm trying to use Dapper dot net in F# to perform a simple SQLite query. Dapper returns a collection of dynamic objects: using them in C# is straightforward, but from what I understood F# has no dynamic property lookup implementation out-of-the-box.
This is working but I suppose there are better ways to do this without resorting to reflection:
let (?) x prop =
let flags = BindingFlags.GetProperty ||| BindingFlags.InvokeMethod
x.GetType().InvokeMember(prop, flags, null, x, [||])
let doQuery () =
//...
let conn = new SQLiteConnection (connString)
conn.Open ()
conn.Query("select first_name from customers")
|> Seq.map (fun c -> c ? first_name)
|> List.ofSeq
What is the best way to implement the ? operator in this case?
This thread consists of several solutions for your problem. Especially, FSharp.Interop.Dynamic is available on NuGet and ready to use.
When using Dapper with F#, you can specify your query parameters using F# Anonymous Records and map the results directly to an F# Record, like so:
[<CLIMutable>]
type CustomerDto =
{
FirstName: string
}
let selectSql = "select first_name as FirstName from customers where first_name = @firstName"
conn.Query<CustomerDto>(selectSql, {|firstName = "Francesco"|})
Note that F# Anonymous Records were introduced in F# 4.6.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With