Scala Tuple of seq to seq of object(对象的seq的元组)

问题描述 投票:0回答:1

我的元组格式为 (DBIO[Seq[Person]], DBIO[Seq[Address]]) 作为一对一的映射。PersonAddress 是RDBMS中的独立表。配置文件的定义是 Profile(person: Person, address: Address). 现在我想把前者转换成 DBIO[Seq[Profile]]. 以下是我如何得到的代码片段 (DBIO[Seq[Person]], DBIO[Seq[Address]])

        for {
          person <- personQuery if person.personId === personId
          address <- addressQuery if address.addressId === profile.addressId
        } yield (person.result, address.result)

需要帮助这种转变为 DBIO[Seq[Profile].

scala slick
1个回答
1
投票

假设你不能使用连接,你需要用两个动作(两个 DBIOs),你可以做的是将两个动作合二为一。

// Combine two actions into a single action
val pairs: DBIO[ ( Seq[Person], Seq[Address] ) ] = 
  (person.result).zip(address.result)

(zip 只是其中之一 多个组合体 你可以用它来操纵 DBIO).

从那里您可以使用 DBIO.map 来将这对数据转换为你想要的数据基础设施。

比如说。

// Use Slick's DBIO.map to map the DBIO value into a sequence of profiles:
val profiles: DBIO[Seq[Profile]] = pairs.map { case (ppl, places) => 
  // We now use a regular Scala `zip` on two sequences:
  ppl.zip(places).map { case (person, place) => Profile(person, place) }
}

-1
投票

我对什么DBIO都不熟悉。假设它是某个类型T的case类 。

val (DBIO(people), DBIO(addresses)) = for {
  person <- personQuery if person.personId === personId
  address <- addressQuery if address.addressId === profile.addressId
} yield (person.result, address.result)

val profiles = DBIO(people.zip(addresses).map{ case (person, address) => Profile(person, address)})
© www.soinside.com 2019 - 2024. All rights reserved.