Scala 光滑泛型查询返回类型

Scala 光滑泛型查询返回类型,scala,slick,Scala,Slick,我正在制作一个函数,用于过滤slick中的查询,如下所示: class Foos(tag: Tag) extends RichTable[Foo](tag, "t_foo") { // foo slick mapping } 工作功能 object Foos extends PostgresGeneric[Foos, Foo] { private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], sear

我正在制作一个函数,用于过滤slick中的查询,如下所示:

class Foos(tag: Tag) extends RichTable[Foo](tag, "t_foo") {
    // foo slick mapping
}
工作功能

object Foos extends PostgresGeneric[Foos, Foo] {
    private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], searchFilter: FooFilter) = {
        var filteredQuery = query

        if(searchFilter.searchEntity.isDefined) {
          val searchEntity = searchFilter.searchEntity.get

          if(searchEntity.cancelled.isDefined) {
            filteredQuery = filteredQuery.filter(p => p.cancelled === searchEntity.cancelled.get)
          }

          if(searchEntity.nome.isDefined) {
            filteredQuery = filteredQuery.filter(p => p.nome.toLowerCase like "%"+searchEntity.nome.get.toLowerCase()+"%")
          }

          if(searchEntity.localidade.isDefined) {
            filteredQuery = filteredQuery.filter(_.localidade === searchEntity.localidade)
          }
        }

        filteredQuery
    }
}
object Foos extends PostgresGeneric[Foos, Foo] {
    private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], searchFilter: FooFilter) = {
        var filteredQuery = query

        if(searchFilter.searchEntity.isDefined) {
          val searchEntity = searchFilter.searchEntity.get

          if(searchEntity.cancelled.isDefined) {
            filteredQuery = filteredQuery.filter(p => p.cancelled === searchEntity.cancelled.get)
          }

          if(searchEntity.nome.isDefined) {
            filteredQuery = filteredQuery.filter(p => p.nome.toLowerCase like "%"+searchEntity.nome.get.toLowerCase()+"%")
          }

          if(searchEntity.localidade.isDefined) {
            filteredQuery = filteredQuery.filter(_.localidade === searchEntity.localidade)
            filteredQuery = filteredQuery.join(tableReferenceFoo2).on(_.foo2 === _.id)
          }
        }

        filteredQuery
    }
}
不工作功能

object Foos extends PostgresGeneric[Foos, Foo] {
    private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], searchFilter: FooFilter) = {
        var filteredQuery = query

        if(searchFilter.searchEntity.isDefined) {
          val searchEntity = searchFilter.searchEntity.get

          if(searchEntity.cancelled.isDefined) {
            filteredQuery = filteredQuery.filter(p => p.cancelled === searchEntity.cancelled.get)
          }

          if(searchEntity.nome.isDefined) {
            filteredQuery = filteredQuery.filter(p => p.nome.toLowerCase like "%"+searchEntity.nome.get.toLowerCase()+"%")
          }

          if(searchEntity.localidade.isDefined) {
            filteredQuery = filteredQuery.filter(_.localidade === searchEntity.localidade)
          }
        }

        filteredQuery
    }
}
object Foos extends PostgresGeneric[Foos, Foo] {
    private def filterQuery(query :Query[Foos,Foos#TableElementType,Seq], searchFilter: FooFilter) = {
        var filteredQuery = query

        if(searchFilter.searchEntity.isDefined) {
          val searchEntity = searchFilter.searchEntity.get

          if(searchEntity.cancelled.isDefined) {
            filteredQuery = filteredQuery.filter(p => p.cancelled === searchEntity.cancelled.get)
          }

          if(searchEntity.nome.isDefined) {
            filteredQuery = filteredQuery.filter(p => p.nome.toLowerCase like "%"+searchEntity.nome.get.toLowerCase()+"%")
          }

          if(searchEntity.localidade.isDefined) {
            filteredQuery = filteredQuery.filter(_.localidade === searchEntity.localidade)
            filteredQuery = filteredQuery.join(tableReferenceFoo2).on(_.foo2 === _.id)
          }
        }

        filteredQuery
    }
}
错误消息

Error:(165, 76) type mismatch;
 found   : scala.slick.lifted.Query[(model.db.entity.Foos, model.db.entity.Foos2),(model.db.entity.Foo, model.db.entity.Foos2#TableElementType),Seq]
    (which expands to)  scala.slick.lifted.Query[(model.db.entity.Foos, model.db.entity.Foos2),(model.db.entity.Foo, model.db.entity.Foo2),Seq]
 required: slick.driver.PostgresDriver.simple.Query[model.db.entity.Foos,model.db.entity.Foo,Seq]
    (which expands to)  scala.slick.lifted.Query[model.db.entity.Foos,model.db.entity.Foo,Seq]
        filteredQuery = filteredQuery.join(tableReferenceFoo2).on(_.Foo2 === _.id)
第一个代码起作用,因为过滤后生成的查询始终具有相同的类型。它在联接后失败,因为类型更改

问题:

在我需要与另一个表执行联接之前,此函数一直正常工作


那么,我怎样才能以一种方式键入这个查询实例,使它接受一种可以装载任何类型查询的类型呢?可能吗?

也许编译器无法确定函数的类型。你试过定义它的返回类型吗?我真的不知道返回类型。它可以是Query[Foos,Foos#TableElementType,Seq]或Query[(Foos,Foos2,FoosN),(Foos#TableElementType,Foos2#TableElementType,FoosN#TableElementType),Seq]如果它有joinsCan,你可以包括一个有效的示例和一个失败的示例,以及编译器消息?失败示例上的编译器消息是什么?