首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala Tuple of seq to seq of object

Scala Tuple of seq to seq of object
EN

Stack Overflow用户
提问于 2020-05-27 11:47:15
回答 2查看 291关注 0票数 0

我有(DBIO[Seq[Person]], DBIO[Seq[Address]])格式的元组作为一对一的映射。在关系数据库管理系统中,PersonAddress是不同的表。配置文件定义为Profile(person: Person, address: Address)。现在我想将前者转换为DBIO[Seq[Profile]]。下面是我如何获得(DBIO[Seq[Person]], DBIO[Seq[Address]])的代码片段

代码语言:javascript
复制
        for {
          person <- personQuery if person.personId === personId
          address <- addressQuery if address.addressId === profile.addressId
        } yield (person.result, address.result)

我需要帮助来完成这个到DBIO[Seq[Profile]的转换。

EN

回答 2

Stack Overflow用户

发布于 2020-05-27 16:05:12

假设您不能使用join,并且您需要使用两个操作(两个DBIO),那么您可以做的是将这两个操作合并为一个操作:

代码语言:javascript
复制
// Combine two actions into a single action
val pairs: DBIO[ ( Seq[Person], Seq[Address] ) ] = 
  (person.result).zip(address.result)

(zip只是您可以用来操作DBIOmany combinators之一)。

在那里,您可以使用DBIO.map将该对转换为您想要的数据结构。

例如:

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2020-05-27 15:51:33

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

代码语言:javascript
复制
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)})
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62035092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档