异步数据库查询

sik*_*iki 3 f# f#-3.0

我刚刚开始使用F#和.Net但是经过一些谷歌搜索我没有找到这个例子.如果这太简单,我会提前道歉.

我正在尝试查询数据库并异步执行.例如,我有一个像这样的函数:

let queryExample name = 
    query {for f in foo do
           where (f.name = name)
           select f.name}
    |> Seq.toList
Run Code Online (Sandbox Code Playgroud)

现在,我将如何制作异步版本?query不返回Async<'a>类型.

kvb*_*kvb 5

答案取决于你所查询的内容.许多数据源都会暴露出类似于数据上下文的内容,这些内容可以以不同的方式运行查询,但这不会直接暴露在IQueryable类型上(因此,您不能直接使用query { ... }表达式的结果.

举个例子,如果你foo是LINQ-to-SQL Table<Foo>,那么你可以这样做:

let queryExample name =
    let q = 
        query { for f in foo do
                where (f.name = name)
                select f.name }
    let cmd = foo.Context.GetCommand(q)
    async {
        let! reader = Async.AwaitTask (cmd.ExecuteReaderAsync())
        return foo.Context.Translate<Foo>(reader)
    }
Run Code Online (Sandbox Code Playgroud)

这将返回一个Async<seq<Foo>>.如果您将运行这样的大量查询,那么很容易将其解析为可重用的机制.