2015-12-21 23 views
5

Slick 3.1'i kullanarak, birden çok Sorguyu aynı tür için tek bir sorguda nasıl birleştiririm? Bu, bir birleştirme veya birleşim değil, tek bir sorgu isteği oluşturmak için "segmentleri" birleştiren değil. Bu "segmentler" tek tek geçerli bir sorgu olabilir.Kaygan sorguları tek bir sorguda birleştiriyor

val query = TableQuery[SomeThingValid] 

// build up pieces of the query in various parts of the application logic 
val q1 = query.filter(_.value > 10) 
val q2 = query.filter(_.value < 40) 
val q3 = query.sortBy(_.date.desc) 
val q4 = query.take(5) 

// how to combine these into a single query ? 
val finalQ = ??? q1 q2 q3 q4 ??? 

// in order to run in a single request 
val result = DB.connection.run(finalQ.result) 

DÜZENLEME: beklenen sql olması gereken bir şey gibi:

SELECT * FROM "SomeThingValid" WHERE "SomeThingValid"."value" > 10 AND "SomeThingValid"."valid" < 40 ORDER BY "MemberFeedItem"."date" DESC LIMIT 5 
+1

Sonuç olarak beklediğinizden emin değilim. Sanırım sormam gerek: bunu basit SQL'de nasıl yaparsın? –

+0

@ PatrykĆwiek örnek beklenen sql – IUnknown

cevap

4
val q1 = query.filter(_.value > 10) 
val q2 = q1.filter(_.value < 40) 
val q3 = q2.sortBy(_.date.desc) 
val q4 = q3.take(5) 

Ben böyle bir şey işe yarayabilir yukarıdaki gibi bir şey (ve etrafında Query s geçmesi), ancak sorgu "segmentler" etrafında geçen ısrar ederseniz gerektiğini düşünüyorum:

type QuerySegment = Query[SomeThingValid, SomeThingValid, Seq] => Query[SomeThingValid, SomeThingValid, Seq] 

val q1: QuerySegment = _.filter(_.value > 10) 
val q2: QuerySegment = _.filter(_.value < 40) 
val q3: QuerySegment = _.sortBy(_.date.desc) 
val q4: QuerySegment = _.take(5) 

val finalQ = Function.chain(Seq(q1, q2, q3, q4))(query) 
+0

evet, bir sorgunun tümceciklerini ekleyebilirim, amaç, oluşturulmuş çeşitli sorguları almak ve bunları örnekte olduğu gibi sql oluşturmak için bir araya getirmekti. – IUnknown

+0

@Inyanmamış benim düzenleme bakın. – danielnixon

+0

güzel, teşekkürler - Ben tam olarak bu sorgunun içinden geçemediğim neden – IUnknown

0

sanırım

val query = TableQuery[SomeThingValid] 

val flag1, flag3 = false 
val flag2, flag4 = true 

val bottomFilteredQuery = if(flag1) query.filter(_.value > 10) else query 
val topFilteredQuery = if(flag2) bottomFilteredQuery.filter(_.value < 40) else bottomFilteredQuery 
val sortedQuery = if(flag3) topFilteredQuery.soryBy(_.date.desc) else topFilteredQuery 
val finalQ = if(flag4) sortedQuery.take(5) else sortedQuery 
+0

ile güncellendi, bu benim durumumda çalışmayacaktır çünkü gelen sorgu deterministik olmayan keyfi bir settir. – IUnknown

-1

, çalışmalıdır slick2.0 ile bu "desen" kullandım . Ama henüz test etmedim.

val users = TableQuery[Users] 
val filter1: Query[Users, User, Seq] = users.filter(condition1) 
val filter2: Query[Users, User, Seq] = users.filter(condition2) 
(filter1 ++ filter2).result.headOption 
İlgili konular