所以我目前有一个fetchGroups
类型的序列,我想把它变成XRecord
类型的序列。
我当前正在使用TaskBuilder.fs库,根据我的研究,我需要使用let!还是做!对于这种情况,但是他们需要seq<System.Threading.Tasks.Task<Restaurant>>
,当与Seq.map一起使用时,它会带回相同的任务类型。
seq<Restaurant>
所以我的结果是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
}
的restaurantWithReviews,我将无法使用。
答案 0 :(得分:2)
.NET方法System.Threading.Tasks.Task.WhenAll
将seq<Task<'a>>
转换为Task<'a[]>
。如果您位于let!
块中,则可以使用task { }
获得结果。
let restaurants: seq<Restaurant>
let! withReviews: Restaurant[] =
restaurants
|> Seq.map joinWithReviews
|> Task.WhenAll