ceth
ceth

Reputation: 45295

Pass query and function to another function

I have a method which works fine:

 member this.GetItems = 
        let db = dbSchema.GetDataContext()             
        let getQuery = 
            query {
                for row in db.ItemsTable do
                select row
            }
        getQuery 
        |> Seq.map (fun e -> new Item(e.ItemId, e.ItemName ))
        |> Seq.toArray

It make the select query to database, transforms each record to object and returns an array of such objects.

I want to split this method to two. First one must be more general. It gets query and function to transform record to object.

Here is my code:

member private this.ExecuteSelectQuery(query, transform_function) =
    let db = dbSchema.GetDataContext()             
    query 
    |> Seq.map transform_function
    |> Seq.toArray

member this.GetItems = 
    let db = dbSchema.GetDataContext()             

    this.ExecuteSelectQuery 
        query {
            for row in db.ItemsTable do
            select row
        } 
        (fun e -> new Item(e.ItemId, e.ItemName ))

But I get the errors:

How can I fix it ?

Updated:

member private this.ExecuteSelectQuery query transform_function =
    let db = dbSchema.GetDataContext()             
    query 
    |> Seq.map transform_function
    |> Seq.toArray

member this.GetItems = 
    let db = dbSchema.GetDataContext()             

    this.ExecuteSelectQuery 
        query {
            for row in db.ItemsTable do
            select row
        } 
        (fun e -> new Item(e.ItemId, e.ItemName ))

Upvotes: 0

Views: 92

Answers (1)

Max Malook
Max Malook

Reputation: 513

The member function ExecuteSelectQuery expects the arguments as a tuple, so you have to use parentheses.

member private this.ExecuteSelectQuery(query, transform_function) =
    query 
    |> Seq.map transform_function
    |> Seq.toArray

member this.GetItems = 
    use db = dbSchema.GetDataContext()             

    this.ExecuteSelectQuery (
        query {
            for row in db.ItemsTable do
            select row
        }, 
        (fun e -> new Item(e.ItemId, e.ItemName )))

Please consider also the use keyword for binding of DataContext instance to correctly implement the disposable pattern. I've done it in my example.

Upvotes: 3

Related Questions