数据类型定义为:
data ComitteeView = CommitteeView { committeeId :: CommitteeId
, committeeMembers :: [Person]
}
data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }
现在,我有一个持久的模型,定义为:
Person
name Text
Committee
name Text
CommitteePerson
personId PersonId
committeeId CommitteeId
我可以很容易地创建一个查询,使用Esqueleto填充一个Committee teeView。会是这样的:
getCommitteeView cid =
CommitteeView <$> runDB $
select $
from (person `InnerJoin` pxc `InnerJoin` committee) -> do
on (committee ^. CommitteeId ==. pxc ^. CommitteePersonCommitteeId)
on (person ^. PersonId ==. pxc ^. CommitteePersonPersonId)
where_ (committee ^. CommitteePersonCommitteeId ==. val cid)
return person
现在,考虑一下人口问题。CommitteesView
原则上,我们通过在上面的查询中运行子查询来获得足够的数据来填充。好吧,很公平。现在我如何使用“Haskell-list的组”,比如group by
在SQL中?如何折叠行,以便最终得到一个人员列表?
我觉得esqueleto
无法处理这种情况(也就是说,它没有一个组合器来完成这个任务)。而且我的底层数据库显然不支持Haskell列表作为列。但是,当然,我不能是唯一一个面对这个问题的人。什么是有效的策略?把n个列表折叠成n个列表?或奔跑n+1
询问?还有其他选择吗?
相似问题