Передать пользовательский предикат в метод фильтра TableQuery - PullRequest
3 голосов
/ 06 октября 2019

Я пытаюсь обобщить функцию для фильтрации некоторых TableQuery в пятно, используя filter, поэтому я создал следующий метод:

def fetchCoffee(coffe: String)(p: MyTable => Boolean) =
    // ...
    myTableQuery.filter(p)
    // ...

, и я назвал его так:

fetchCoffee("micoffee")(_.coffeeId == id)

Но с этой ошибкой происходит сбой:

Error:(43, 29) inferred type arguments [Boolean] do not conform to method filter's type parameter bounds [T <: slick.lifted.Rep[_]]
    val query = MyTable.filter(p)
Error:(43, 36) type mismatch;
 found   : MyTable => Boolean
 required: MyTable => T
    val query = myTableQuery.filter(p)
Error:(43, 35) Type T cannot be a query condition (only Boolean, Rep[Boolean] and Rep[Option[Boolean]] are allowed
    val query = myTableQuery.filter(p)

Я пытался изменить тип p на p: MyTable => Rep[Boolean] и Rep[MyTable => Boolean], но все еще не работает. Я также безуспешно пытался передать ExecutionContext как неявное fetchCoffee.

Как мне написать тип предиката для соответствия ограниченному типу T?

1 Ответ

3 голосов
/ 06 октября 2019

Попробуйте использовать Rep[Boolean] вместо Boolean и === вместо ==.

def fetchCoffee(coffe: String)(p: MyTable => Rep[Boolean]) = {
  myTableQuery.filter(p)
}

fetchCoffee("micoffee")(_.coffeeId === id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...