Scala Кортеж от seq к seq объекта - PullRequest
0 голосов
/ 27 мая 2020

У меня есть кортежи формата (DBIO[Seq[Person]], DBIO[Seq[Address]]) как взаимно однозначное сопоставление. Person и Address - это отдельные таблицы в СУБД. Определение профиля 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].

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Предполагая, что вы не можете использовать соединение и вам нужно работать с двумя действиями (двумя DBIO s), вы можете объединить два действия в одно:

// 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) }
}
0 голосов
/ 27 мая 2020

Я не знаком с DBIO. Предполагая, что это класс случая некоторого типа T:

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)})
...