Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 异步数据库查询_F#_F# 3.0 - Fatal编程技术网

F# 异步数据库查询

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答案取决于您查

我刚开始使用F#和.Net,但在谷歌搜索了几次之后,我没有找到这样的例子。如果这太简单了,我提前道歉

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

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方法。您最好希望将它们包装在
异步
,这将消耗线程。另一方面,这可能是获得非阻塞数据库查询的唯一机会。