我刚刚开始使用F#和.Net但是经过一些谷歌搜索后我没有找到这方面的例子。如果这太简单,我会事先道歉。
我正在尝试查询数据库并异步执行。例如,我有一个像这样的函数:
let queryExample name =
query {for f in foo do
where (f.name = name)
select f.name}
|> Seq.toList
现在,我将如何制作异步版本? query
不会返回Async<'a>
类型。
答案 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