gpt4 book ai didi

linq-to-sql - 是否有一个简单的实现来在通用 F# 查询中使用谓词函数

转载 作者:行者123 更新时间:2023-12-02 00:08:38 26 4
gpt4 key购买 nike

我想使用像这样的通用查询函数:

let filter predicateFn =
predicateFn |>
fun f s -> query { for x in s do
where (f(x))
select x }

其中 f 应该是谓词函数。显然,这不能转换为 sql 查询。但是有没有解决这个问题的方法。我看过 C# 的示例解决方案。

方法取自:Web、Cloud & Mobile Solutions with F# by 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 }

最佳答案

终于在 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 的任何查询结果

关于linq-to-sql - 是否有一个简单的实现来在通用 F# 查询中使用谓词函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16800714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com