如何将 Task<MyType> 序列转换为 MyType 序列

How to convert a sequence of Task<MyType> to a sequence of MyType

所以我现在有一个 seq<System.Threading.Tasks.Task<Restaurant>> 类型的序列,我想把它变成 seq<Restaurant>.

类型的序列

我目前正在使用 TaskBuilder.fs 库,根据我的研究,我需要使用 let!或者做!对于这种情况,但他们需要 task {},当与 Seq.map 一起使用时,会带回相同的任务类型。

let joinWithReviews (r : Restaurant) =
    task {
        let! reviewResult = Reviews.Database.getByLocationId cnf.connectionString r.Restaurant_Id
        match reviewResult with
        | Ok reviewResult ->
            let restaurant = { r with Reviews = (List.ofSeq reviewResult)}
            return restaurant
        | Error ex ->
            return raise ex
    }

let indexAction (ctx : HttpContext) =
    task {
        let (cnf:Config) = Controller.getConfig ctx
        let! result = Restaurants.Database.getAll cnf.connectionString
        match result with
        | Ok result ->
            let restaurantWithReviews = (Seq.map joinWithReviews result)
            return index ctx (List.ofSeq restaurantWithReviews)
        | Error ex ->
            return raise ex
    }

所以我的结果是 Seq<Restaurant> 类型,我需要为每家餐厅添加评论,所以我使用 Seq.map 获取 restaurantWithReviews 类型 seq<System.Threading.Tasks.Task<Restaurant>> 我不会能用。

.NET 方法 System.Threading.Tasks.Task.WhenAll 会将 seq<Task<'a>> 转换为 Task<'a[]>。如果您在 task { } 块内,则可以使用 let! 获得结果。

let restaurants: seq<Restaurant>

let! withReviews: Restaurant[] =
    restaurants
    |> Seq.map joinWithReviews
    |> Task.WhenAll