2015-09-27 104 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