光滑 - 使用动态sortBy编译

tfh*_*tfh 12 scala slick slick-2.0

我知道光滑的2.1.可以使用ConstColumn使用"Compiled"来获取和删除预编译的Query.

private val findXXXCompiled = Compiled { 
    (someId:Column[Long], sortBy:???, drop:ConstColumn[Long], take:ConstColumn[Long]) =>
    val q = findXXX(someId) // returns a Query

    // I want to use query composition on "q" in order to further restrict my result:
    q.sortBy {
      case (_, name, state) => sortBy match {
        case ??? => name.asc
        case ??? => name.desc
        case ??? => state.asc
        case ??? => state.desc
      }
    }.drop(drop).take(take) // possible since slick 2.1. as described above using type ConstColumn
}
Run Code Online (Sandbox Code Playgroud)

}

上面的示例代码由用户从具有表格布局的UI触发.如果用户单击"名称"标题,则应根据"名称"对表进行排序 - "状态"相同.

我无法工作的方面是将预编译与动态排序相结合(取决于表格布局中单击的标题).当不预编译查询时,课程的动态排序有效.但是由于方法"findXXX"非常复杂,我绝对需要根据性能原因进行预编译.有关如何使用动态排序实现预编译的任何提示?

另请参阅:https://groups.google.com/forum/#!topic/scalaquery/my4EYt51qEM

Ven*_*ama 1

Slick 没有提供一种方法来记忆动态排序的已编译查询。我认为解决这个问题的唯一方法是记住每个排序列的编译查询并根据动态排序键查找查询。即,构建一个映射,其中键是排序列名称,值是使用该列的 sortBy 编译的查询。

当然,如果您编译的查询有一个联接并且您想要对正在联接的表中的列进行排序,那么这对您不起作用。

如果性能不是问题并且您没有其他理由使用编译查询,则不要使用它们。