2015-09-27 99 views
2

在C#中使用EF6我可以很容易地作出这样的异步操作:异步EF查询在F#

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

我怎么能这样做与F#异步工作流程一样吗?我知道query工作流程以及如何使用它来代替LINQ,但我不知道如何使它正确异步(即没有永久消耗线程池,就像在C#示例中一样)。这是我走到这一步,(它是同步):

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

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

回答

4

您可以使用您在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 
+0

傻了我,没有想过这件事。谢谢! – ForNeVeR