Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamic SQL queries with F# 3.0?

Tags:

sql

f#

I have tried to use FLINQ but it is rather out of date with F# 3.0 beta.

Can someone give me some pointers on how to create dynamic SQL queries in F#?

like image 684
Arthur Greef Avatar asked Dec 05 '22 16:12

Arthur Greef


1 Answers

We have recently developed a library, FSharpComposableQuery, aimed at supporting more flexible composition of query expressions in F# 3.0 and above. It's intended as a drop-in replacement overloading the standard query builder.

Tomas's example can be modified as follows:

open FSharpComposableQuery

// Initial query that simply selects products
let q1 = 
  <@ query { for p in ctx.Products do 
             select p }  @>

// Create a new query that specifies only expensive products
let q2 = 
  query { for p in %q1 do
          where (p.UnitPrice.Value > 100.0M) }

This simply quotes the query expression and splices it into the second query. However, this results in a quoted query expression that the default QueryBuilder may not be able to turn into a single query, because q2 evaluates to the (equivalent) expression

query { for p in (query { for p in ctx.Products do 
                          select p }) do
        where (p.UnitPrice.Value > 100.0M) }

which (as in Tomas's original code) will likely be evaluated by loading all of the products into memory, and doing the selection in memory, whereas what we really want is something like:

query { for p in ctx.Products do
        where (p.UnitPrice.Value > 100.0M) }

which will turn into an SQL selection query. FSharpComposableQuery overrides the QueryBuilder to perform this, among other, transformations. So, queries can be composed using quotation and antiquotation more freely.

The project home page is here: http://fsprojects.github.io/FSharp.Linq.ComposableQuery/

and there is some more discussion in an answer I just provided to another (old) question about dynamic queries: How do you compose query expressions in F#?

Comments or questions (especially if something breaks or something that you think should work doesn't) are very welcome.

[EDIT: Updated the links to the project pages, which have just been changed to remove the word "Experimental".]

like image 196
James Cheney Avatar answered Dec 08 '22 04:12

James Cheney