3.3.3 在多列上使用 `.inSet` 过滤表

问题描述

我有一个元组(2 个不同的列)作为主键的表。我正在尝试创建一个函数 findByPrimaryKeys(pks: Vector[(Long,Long)]),该函数返回对集合 pks 中具有主键的所有行的查询。不过这个好像没有办法,我可以做

table.filter(t => t.id1.inSet(pks.map(_._1)) && t => t.id2.inSet(pk2.map(_._2)))

然而,这并不完全正确,因为它可能返回具有匹配 id2 但不匹配 id1 的内容

有没有办法组合Rep

解决方法

是的,可以组合 Rep 值,存在从 (Rep[Long],Rep[Long])Rep[(Long,Long)] 的隐式转换。但这在这种情况下无济于事,因为 inSet 是通过隐式转换添加的,而该转换需要隐式 BaseTypedType[(Long,Long)] 可用,而事实并非如此。

我知道解决这个问题的唯一方法是使用折叠:

table.filter { t =>
  pks.foldLeft[Rep[Boolean]](false) { case (a,(x,y)) =>
    a || (t.id1 === x && t.id2 === y)
  }
}