我想使用通用查询功能,如:
let filter predicateFn =
predicateFn |>
fun f s -> query { for x in s do
where (f(x))
select x }
其中f应该是谓词函数。显然,这不能转换为SQL查询。但有没有解决这个问题的方法。我见过C#的示例解决方案。
采取的方法:Web,Cloud&移动解决方案使用F#作者Daniel Mohl。
编辑:示例澄清:
let userSorter = fun (u:users) -> u.Login
let sorted =
query { for user in dbConn.GetDataContext().Users do
sortBy ((fun (u:users) -> u.Login)(user))
select user.Login }
基本上,我想用userSorter替换lambda。因为它是上面的代码运行,但这将失败:
let userSorter = fun (u:users) -> u.Login
let sorted =
query { for user in dbConn.GetDataContext().Users do
sortBy (userSorter(user))
select user.Login }
答案 0 :(得分:3)
终于在Stackoverflow上找到了解决方案:
open System.Linq
open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Quotations.Patterns
let runQuery (q:Expr<IQueryable<'T>>) =
match q with
| Application(Lambda(builder, Call(Some builder2, miRun, [Quote body])), queryObj) ->
query.Run(Expr.Cast<Microsoft.FSharp.Linq.QuerySource<'T, IQueryable>>(body))
| _ -> failwith "Wrong argument"
let test () =
<@ query { for p in db.Products do
where ((%predicate) p)
select p.ProductName } @>
|> runQuery
|> Seq.iter (printfn "%s")
积分应该归Tomas Petricek,你可以得到我的赏金!
修改:匹配任何类型为“T see my other Q&A
”的查询结果