F#中的异步EF查询

For*_*VeR 2 f# asynchronous entity-framework-6

在使用EF6的C#中,我可以轻松地进行如下的异步操作:

using (var context = new MyDbContext()) {
    var item = await context.SomeEntities.Where(e => e.Id == 1).FirstAsync();
    DoSomething(item);
}
Run Code Online (Sandbox Code Playgroud)

我怎么能用F#异步工作流程做同样的事情?

我知道query工作流以及如何使用它代替LINQ,但我不知道如何使其正确异步(即没有永久消耗线程池,就像在C#示例中一样).这是我到目前为止所得到的(它是同步的):

use context = MyDbContext()
let item = query {
    for e in context.SomeEntities
    where (e.Id = 1)
    head
}
DoSomething item
Run Code Online (Sandbox Code Playgroud)

我正在寻找一些操作headAsync(类似于FirstAsyncC#查询)或其他可靠的解决方案.

Jak*_*rtz 6

您可以使用在C#中使用的相同扩展方法.

open System.Data.Entity

let asyncQuery = async {
    return! 
        query { 
        for e in context.SomeEntities do
        where (e.Id = 1)
        select e}
        |> QueryableExtensions.FirstAsync
        |> Async.AwaitTask
}

let result = Async.RunSynchronously asyncQuery
Run Code Online (Sandbox Code Playgroud)