【问题标题】:Async database query异步数据库查询
【发布时间】:2014-01-13 17:16:40
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: f# f#-3.0


    【解决方案1】:

    答案取决于您要查询的内容。许多数据源会公开诸如数据上下文之类的东西,它可以以不同的方式运行查询,但这不会直接在 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)
        }
    

    这将返回一个Async&lt;seq&lt;Foo&gt;&gt;。如果您将运行大量这样的查询,那么很容易将其提取到可重用机制中。

    【讨论】:

    • 我正在使用 LINQ-to-EF。基本上,还没有 PostgreSQL 或 MySQL 的类型提供程序,所以我必须使用实体框架的类型提供程序。
    • @GaborSiklos - 在 EF 的情况下,它可能会容易得多(假设您使用的是 EF 6)。我认为您可以在查询中使用ToListAsync 扩展方法,并结合Async.AwaitTask
    • 谢谢,但我使用的是 EF 4.x。那我有什么选择呢?感谢大家的帮助!
    • @GaborSiklos EF4 和 5 都不支持直接异步 IO 方法。最好的办法是将它们包装在async 中,这将消耗线程。另一方面,这可能是您获得非阻塞数据库查询的唯一机会。
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-12-17
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        • 1970-01-01
        • 2012-10-24
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多