F# 异步数据库查询
我刚开始使用F#和.Net,但在谷歌搜索了几次之后,我没有找到这样的例子。如果这太简单了,我提前道歉 我正在尝试查询数据库并异步执行它。例如,我有这样一个函数:F# 异步数据库查询,f#,f#-3.0,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答案取决于您查
let queryExample name =
query {for f in foo do
where (f.name = name)
select f.name}
|> Seq.toList
现在,我该如何制作这个的异步版本
query
不返回Async答案取决于您查询的内容。许多数据源将公开类似于数据上下文的内容,以不同的方式运行查询,但这并不是直接在IQueryable
类型上公开的(因此不能直接对query{…}
表达式的结果进行公开)
例如,如果您的foo
是一个LINQ to SQL表
,则可以执行以下操作:
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)
}
让queryExample name=
设q=
foodo中f的查询{
其中(f.name=name)
选择f.name}
让cmd=foo.Context.GetCommand(q)
异步的{
let!reader=Async.AwaitTask(cmd.ExecuteReaderAsync())
返回foo.Context.Translate(读取器)
}
这将返回一个Async
。如果要运行大量这样的查询,那么很容易将其内容提取到一个可重用的机制中。我成功地使用了FSharp.Data.Sql
下面的示例演示了一种简单的语法,基本上只需创建一个包含查询表达式的异步函数并返回结果
let data = [ 1; 5; 7; 11; 18; 21]
let getEvenInts = fun (arr : list<int> ) -> async {
let q = query {
for N in arr do
where (( N % 2 ) = 0)
select N
}
return q
}
let getOddInts = fun (arr : list<int> ) -> async {
let q = query {
for N in arr do
where (( N % 2 ) <> 0)
select N
}
return q
}
let evens = getEvenInts data |> Async.RunSynchronously
let odds = getOddInts data |> Async.RunSynchronously
printfn "Evens: %A Odds: %A" evens odds
let data=[1;5;7;11;18;21]
让getEvenInts=fun(arr:list)->async{
设q=query{
对于arr do中的N
其中((N%2)=0)
选择N
}
返回q
}
让getOddInts=fun(arr:list)->async{
设q=query{
对于arr do中的N
其中((N%2)0)
选择N
}
返回q
}
让evens=getEvenInts data |>Async.RunSynchronously
让赔率=getOddInts数据|>Async.RunSynchronously
打印fn“偶数:%A赔率:%A”偶数赔率
我使用的是LINQ to EF。基本上,PostgreSQL或MySQL还没有类型提供程序,因此我必须为实体框架使用类型提供程序。@GaborSiklos-在EF的情况下,可能更容易(假设您使用的是EF 6)。我认为您可以在查询中使用扩展方法,并结合异步.AwaitTask
。谢谢,但我使用的是EF 4.x。那么我的选项是什么?感谢所有帮助!@GaborSiklos EF4和5都不支持直接异步IO方法。您最好希望将它们包装在异步,这将消耗线程。另一方面,这可能是获得非阻塞数据库查询的唯一机会。