Scala 光滑型投影

Scala 光滑型投影,scala,slick,Scala,Slick,我试图在查询端定义一个类型来映射我的联接,这样我就可以避免返回一个必须手动应用于投影案例类post查询的值元组 考虑到这样的关系: case class Parent(id: Int, name: String, extra: String) class ParentTable(tag: Tag) extends Table[Parent](tag, "parent") { def id = column[Int]("id", O.PrimaryKey, O.AutoInc) def

我试图在查询端定义一个类型来映射我的联接,这样我就可以避免返回一个必须手动应用于投影案例类post查询的值元组

考虑到这样的关系:

case class Parent(id: Int, name: String, extra: String)

class ParentTable(tag: Tag) extends Table[Parent](tag, "parent") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def extra = column[String]("extra")
  def * = (id, name, extra) <> (Parent.tupled, Parent.unapply)
}

val parents = TableQuery[ParentTable]

case class Child(id: Int, parentId: Int, name: String, extra:  String)

class ChildTable(tag: Tag) extends Table[Child](tag, "child") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def parentId = column[Int]("parent_id")
  def parent = foreignKey("parent_fk", parentId, parents)(_.id)
  def name = column[String]("name")
  def extra = column[String]("extra")
  def * = (id, parentId, name, extra) <> (Child.tupled, Child.unapply)
}
val children = TableQuery[ChildTable]
连接和投影看起来像:

val q = for {
  c <- children
  p <- parents if c.parentId === p.id
} yield (c.id,c.name,p.name)
我想在查询端创建一个具有如下形状的类型:

class ChildParentProjection(val id: Rep[Int], 
                            val name: Rep[String], 
                            val parentName[String])
这样我就可以得到一个函数签名,比如:

Query[ChildParentProjection, ChildWithParentName, Seq]

这在slick中可能吗?

我真的不明白您为什么要使用类
ChildParentProjection
。 如果在查询上执行
result
时要返回
Seq[ChildWithParentName]
,则必须将一元联接产生的元组映射到
ChildWithParentName
类,如下所示:

val q = for {
c <- children
p <- parents if c.parentId === p.id
} yield (c.id,c.name,p.name) <> (ChildWithParentName.tupled,ChildWithParentName.unapply)
val q=for{

c谢谢。我不知道
可以应用于查询级别。生成的
MappedProjection
正是我想要完成的,比我想象中需要做的要简单得多,即不需要
ChildParentProjection
。不过,还有一个问题:Before
q
很容易回答在
排序中使用,但我似乎无法从
MappedProjection中提取元组或
ChildWithParentName`
Query[ChildParentProjection, ChildWithParentName, Seq]
val q = for {
c <- children
p <- parents if c.parentId === p.id
} yield (c.id,c.name,p.name) <> (ChildWithParentName.tupled,ChildWithParentName.unapply)