Slick 3.1,左连接和过滤器

3
我有一个带有两个左连接的Slick查询(它们最终成为Rep [Option [ ...]]),并且使用列映射。我需要在结果上过滤(使用like)。如果三个列中的任何一个匹配like条件,则必须将行包含在结果中,因此我不能预先过滤表 - 我必须过滤结果联接的Rep [Option]

我无法弄清楚如何过滤Rep [Option [String]]列。 由于“无法解析符号||”,下面的代码无法编译 - 如果我删除Rep [Option]列,则可以完美编译。

val joinedTable = Sites.map(s=>(s.id, s.gisId))
                       .joinLeft(SiteText.filter(_.lang==="jp").map(l=>(l.name, l.siteId))).on{ case(s,t)=>s._1===t._2 }
                       .joinLeft(SiteText.filter(_.lang==="en").map(l=>(l.name, l.siteId))).on{ case(st,t)=>st._1._1===t._2 }

val searchedTable = joinedTable.filter { row =>
  List(
    searchStr.map( t => row._1._1._2 like t ),
    searchStr.map( t => row._1._2.map(_._1 like t) ),
    searchStr.map( t => row._2.map(_._1 like t) )
  ).collect({case Some(criteria)  => criteria}).reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
}
1个回答

1
以下对我来说似乎有效:

joinedTable
  .filter({ case ((a, b), c) => List(
      searchStr.map(t => (a._2 like t)),
      searchStr.map(t => b.filter(_._1 like t).isDefined),
      searchStr.map(t => c.filter(_._1 like t).isDefined)
    )
    .flatten
    .reduceLeftOption(_ || _)
    .getOrElse(false: Rep[Boolean])
  })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接