代码之家  ›  专栏  ›  技术社区  ›  ceth

将查询和函数传递给另一个函数

f#
  •  0
  • ceth  · 技术社区  · 11 年前

    我有一个很好的方法:

     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类型
    • 这种构造只能在以下情况下使用:

    我该如何修复它?

    更新时间:

    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 回复  |  直到 11 年前
        1
  •  3
  •   Max Malook    11 年前

    成员函数 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 实例以正确实现一次性模式。我已经在我的例子中做到了。