0
votes

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:

  • In this expression required type 'a * ('b -> 'c) but there is a type QueryBuilder
  • This construction can be used only in the case of the method For

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 ))
1

1 Answers

3
votes

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.