【问题标题】:Pass query and function to another function将查询和函数传递给另一个函数
【发布时间】:2015-04-20 20:24:14
【问题描述】:

我有一个很好的方法:

 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

它对数据库进行选择查询,将每条记录转换为对象并返回一个此类对象的数组。

我想将此方法一分为二。第一个必须更一般。它获取查询和函数将记录转换为对象。

这是我的代码:

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

但我得到了错误:

  • 在这个表达式中需要类型 'a * ('b -> 'c) 但有一个类型 QueryBuilder
  • 这种结构只能用于 For 方法的情况

我该如何解决?

更新:

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

【问题讨论】:

    标签: f#


    【解决方案1】:

    成员函数ExecuteSelectQuery 期望参数为元组,因此您必须使用括号。

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

    还请考虑use 关键字用于绑定DataContext 实例以正确实现一次性模式。我已经在我的例子中做到了。

    【讨论】:

    • 谢谢。它有效,但我还有一个问题。我想使用非元组版本。所以我删除了括号和逗号,但出现错误:此值不是函数,无法应用。我已经更新了我的问题。有可能吗?
    • 对于 curried(非元组)版本,您需要在 query {...} 周围加上括号。没有它们,它将被解析为ExecuteSelectQuery 的两个单独参数,而不是单个表达式。
    猜你喜欢
    • 2019-10-09
    • 2019-07-25
    • 2014-01-06
    • 1970-01-01
    • 2012-09-25
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多