如何使用 F# return 在 Dapper 中将表连接为强类型记录

How to return Joined Tables as Strongly Typed Records in Dapper with F#

这个库不能满足我的需求https://github.com/Dzoukr/Dapper.FSharp所以我想直接从 F# 使用 Dapper

我想可能是我对F#了解不够,C#是怎么翻译的。

在此页面中 https://www.learndapper.com/relationships 我正在尝试为那里的一对多关系建模

var products = await connection.QueryAsync<Product, Category, Product>(sql, (product, category) => {
    product.Category = category;
    return product;
}, 
splitOn: "CategoryId" );

这是我的尝试(失败且未完全完成)。如何将以上内容“翻译”成 F#?

conn.QueryAsync<Order,OrderDetail, Order>(orderSql,(fun (order,orderDetail) -> (order, orderDetail )))

(这甚至不是可以编译的代码——甚至不知道从哪里开始)

下面是将示例直接翻译成 F# 的版本:

open System.Data.SqlClient
open Dapper

[<CLIMutable>]
type Product =
    {
        ProductId : int
        ProductName : string
        mutable Category : Category
    }

and [<CLIMutable>]
Category =
    {
        CategoryId : int
        CategoryName : string
        Products : Product[]
    }

[<EntryPoint>]
let main argv =
    use connection = new SqlConnection("Server=localhost;Database=Northwind;Trusted_Connection=True;")
    let sql = "select productid, productname, p.categoryid, categoryname \
               from products p \
               inner join categories c on p.categoryid = c.categoryid"
    let products =
        async {
            return!
                connection.QueryAsync(
                    sql,
                    (fun product category ->
                        product.Category <- category
                        product),
                    splitOn = "CategoryId")
                |> Async.AwaitTask
        } |> Async.RunSynchronously
    printfn "%A" products
    0

这不是真正地道的 F#(例如,由于可变字段),但它确实有效。