首页 > 解决方案 > F# 查询表达式嵌套列表

问题描述

我正在尝试查询每个包含与会者列表的事件列表。我在 EF db 上下文中使用查询表达式。我设法做到了这样:

 let events =
     query {
         for event in db.Events do             
         leftOuterJoin ea in db.EventAttendances 
           on (event.Id = ea.EventId) into result

         for ea in result do
         select ({|Id = event.Id
                   Description = event.Description
                   DateTime = event.DateTime
                 |}, {| FirstName = ea.Member.FirstName
                        LastName = ea.Member.LastName
                        IsAttending = ea.IsAttending |})
     }
     |> Seq.toList
     |> List.groupBy (fun (e, _) -> e)
     |> List.map (fun (e, attendees) ->
         { Id = e.Id
           Description = e.Description
           DateTime = e.DateTime
           Attendees = attendees
                       |> Seq.map(fun (_, a) ->
                           { FirstName = a.FirstName
                             LastName = a.LastName
                             IsAttending = ea.IsAttending })
                       |> Seq.toList

            } )

我习惯用 EF 来做这件事,所以整个groupBy事情对我来说似乎有点麻烦。有没有更聪明的方法来做到这一点?

标签: f#

解决方案


你在做什么几乎就是做什么groupJoin

let events =
    query {
        for event in db.Events do
        groupJoin ea in db.EventAttendances on (event.Id = ea.EventId) into result
        select (event, query { for ea in result do
                               select { FirstName = ea.Member.FirstName
                                        LastName = ea.Member.LastName
                                        IsAttending = ea.IsAttending } })
    }
    |> Seq.map (fun (e, attendees) ->
         { Id = e.Id
           Description = e.Description
           DateTime = e.DateTime
           Attendees = attendees |> Seq.toList })
    |> Seq.toList

推荐阅读