3

数日間解決できない問題があります。

オプションの値に応じて動的クエリを作成したいと思います。値が定義されている場合は、選択した結果を照会し、それ以外の場合は * テーブルの射影を取得します。Lift Embedding DSL と通常の Scala コードを for-comprehension で混在させることは不可能なので、これを達成する他の方法はありますか?

val x: Option[String] = Some("John")

のように見える、またはそのことを行う何か

val result = for {
   w <- workers if (x.isDefined) w.name === x else * projection 
}

また、オプションの引数を持つ関数を記述し、それらを WHERE 句または条件で生成されるクエリにチェーンする方法はありますか? OPTIONAL引数の動的な数については、MaybeFilterでこれを行うことができましたが、AND条件のみです。

case class MaybeFilter[X, Y](val query: scala.slick.lifted.Query[X, Y, Seq])     {
  def filteredBy(op: Option[_])(f: (X) => Column[Option[Boolean]]) = {
    op map { o => MaybeFilter(query.filter(f)) } getOrElse { this }
  }
}

implicit def maybeFilterConversor[X, Y](q: Query[X, Y, Seq]) = new MaybeFilter(q)

val x: Option[String] = Some("Ana")
val y: Option[String] = Some("Lemic")

val result = for { r <- radnik.filteredBy(x)(_.ime === x).filteredBy(y)(_.prz === y).query } yield r

prints out select x2.`Mbr`, x2.`Ime`, x2.`Prz`, x2.`Sef`, x2.`Plt`, x2.`Pre`, x2.`God` from `radnik` x2 where (x2.`Ime` = 'Ana') and (x2.`Prz` = 'Lemic')

私はfilteredByのような任意の数のオプションの条件をチェーンする関数が必要ですが、それは私にORフィルタバインドを生成して次のようなことを達成します

select x2.`Mbr`, x2.`Ime`, x2.`Prz`, x2.`Sef`, x2.`Plt`, x2.`Pre`, x2.`God` from `radnik` x2 where (x2.`Ime` = 'Ana') or (x2.`Prz` = Lemic') or (x2.`God` >= '1950')

filteredBy(someth).またはFilteredBy(someth).filteredBy(someth)のように

前もって感謝します。

4

1 に答える 1