gpt4 book ai didi

f# - 从 F# 函数构建 Linq 表达式,以传递给 C#

转载 作者:行者123 更新时间:2023-12-04 22:53:56 26 4
gpt4 key购买 nike

我正在尝试在 WinRT 8.1 应用程序的 F# 项目中使用 Lex.Db 数据库。

我正在关注 this tutorial对于 C#。我已经成功地将 Lex.Db 的引用添加到 F# 项目中,并且教程中的简单调用转换为 f# 并编译(例如 let db = new DbInstance("demo") )。

问题是这个 C# 代码:

db.Map<Contact>().Key(i => i.Id)

- 编辑 -

为了避免其他人进一步阅读,在 F# 3.0 中这几乎不是问题。请参阅下面的 kvb 评论。解决办法是:
db.Map<Contact>().Key(fun i => i.Id)
- /编辑 - -
Key函数需要一个 Expression<Func<Contact,'a>>我无法在 F# 中构建它。

一个非常相似的问题出现在 How to pass LinQ Expressions from F# to C# code 中.推荐的解决方案是使用 LeafExpressionConverter.QuotationToLambdaExpression .

我试过如下:
 type Contact() =
member val Id = 0 with get, set
member val FirstName = "" with get, set

let db = new DbInstance("Demo")

let idExpr = LeafExpressionConverter.QuotationToLambdaExpression
<@ fun (c : Contact) -> c.Id @>

db.Map<Contact>().Key(idExpr) |> ignore // <- Error

这会在 idExpr 上产生编译器错误:

类型不匹配。期待 Expression<Func<Contact,'a>>但给出了 Expression<(Contact -> int)> .型号 'Func<Contact,'a>'与类型不匹配 'Contact -> int' .

这个问题: Expression<Func<T, bool>> from a F# func似乎直接解决了这个问题,但解决方案使用了 Microsoft.FSharp.Linq.QuotationEvaluation,我在 F# 3.0 for WinRT 中找不到。

怎么转 <@ fun (c : Contact) -> c.Id @>Expression<Func<Contact,'a>> ?

最佳答案

Microsoft.FSharp.Linq.QuotationEvaluation在 PowerPack 中,但从 v3.0 开始,它提供的功能可通过 LeafExpressionConverter 在 Core 中使用.您可以使用您链接的问题中的代码,但将其更改为使用 LeafExpressionConverter对于翻译部分。

open System
open System.Linq.Expressions
open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Linq.RuntimeHelpers

let toLinq (expr : Expr<'a -> 'b>) =
let linq = LeafExpressionConverter.QuotationToExpression expr
let call = linq :?> MethodCallExpression
let lambda = call.Arguments.[0] :?> LambdaExpression
Expression.Lambda<Func<'a, 'b>>(lambda.Body, lambda.Parameters)

关于f# - 从 F# 函数构建 Linq 表达式,以传递给 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23386475/

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