如何在使用inSetBind时添加和子句

时间:2017-11-14 20:32:31

标签: scala slick

尝试添加'&&'使用inSetBind时我的过滤器的子句,但我不能。

这有效:

db.run(lists.filter(f => f.id inSetBind(listIds)).result)

当我尝试添加&&第一节我得到一个错误:

db.run(lists.filter(f => f.id inSetBind(listIds)&&(f.locationId === locationId))。result)

错误是:

ambiguous implicit values:
[error]  both value BooleanOptionColumnCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[slick.lifted.Rep[Option[Boolean]]]
[error]  and value BooleanCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[Boolean]
[error]  match expected type slick.lifted.CanBeQueryCondition[Nothing]

1 个答案:

答案 0 :(得分:1)

据我所知,这是一个简单的解析错误。 Scala看到了

lists.filter(f => f.id inSetBind(listIds) && (f.locationId === locationId))

并将其解析为

lists.filter(f => f.id (inSetBind(listIds) && (f.locationId === locationId)))

所以很难理解。尝试

lists.filter(f => (f.id inSetBind(listIds)) && (f.locationId === locationId))

或者,在这种情况下可能更清楚

lists.filter(f => f.id.inSetBind(listIds) && (f.locationId === locationId))

可以找到Scala的优先规则here。以字母开头的中缀运算符(例如inSetBind)的优先级低于任何其他(中缀)运算符,这就是&&绑定比它更紧密的原因。