异步数据库查询

时间:2014-01-13 17:16:41

标签: f# f#-3.0

我刚刚开始使用F#和.Net但是经过一些谷歌搜索后我没有找到这方面的例子。如果这太简单,我会事先道歉。

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

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

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

3 个答案:

答案 0 :(得分:5)

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

例如,如果您的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)
    }

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

答案 1 :(得分:2)

我成功使用FSharp.Data.Sql http://fsprojects.github.io/SQLProvider/ Seq.executeQueryAsync

答案 2 :(得分:1)

下面的示例显示了执行此操作的简单语法。基本上只需在里面创建一个带有查询表达式的异步函数并返回结果。

MyTable