1

我有一个关于 Slick 的简单问题。抱歉,如果这是有据可查的 - 我可能在搜索中忽略了一些东西。

我有一个如下构建的聚合查询:

def doQuery(/* ... */) = for {
  a <- Query(TableA)
  b <- a.relationship.where // ...
  c <- b.relationship.where // ...
} yield (a, b, c)

这给我一个Query[(A, B, C)].

我还有一个案例类:

case class Aggregate(a: A, b: B, c: C)

我想将我的查询转换为 aQuery[Aggregate]以便我的开发人员可以调用.list()or.firstOption()并获得 a Listor Option

我自然而然地选择了.map()on 方法Query,但它有一个隐含的Shape论点,我不确定如何处理。

这在 Slick 中是直截了当的吗?我们目前使用的是 v1.0.1,但升级到 2.0 也是可能的。

此致,

戴夫

4

2 回答 2

3

在玩了很多之后,我得出结论,这在 Slick 1 中是不可能的。

在 Slick 2 中,您可以使用<>运算符来转换在 for comprehension 的 yield 部分中组装的投影:

def doQuery(/* ... */) = for {
  a <- Query(TableA)
  b <- a.relationship.where // ...
  c <- b.relationship.where // ...
} yield (a, b, c) <> (Aggregate.tupled, Aggregate.unapply)

这与.list和一起按预期工作.firstOption。我不确定尝试使用.insert,.update.delete.

于 2013-10-24T10:58:59.927 回答
0

如果你可以修改doQuery,那么你只是想做yield Aggregate(a, b, c)而不是yield (a, b, c)

或者,如果您想在不修改的情况下转换结果doQuery,那么您可以调用.map { case (a, b, c) => Aggregate(a, b, c) }的结果doQuery

于 2013-10-23T16:05:13.937 回答