我可以转换类型的报价Expr<'a -> 'b>
通过以下代码片段连接到 Linq 表达式:
/// Converts a F# Expression to a LINQ Lambda
let toLambda (exp:Expr) =
let linq = exp.ToLinqExpression() :?> MethodCallExpression
linq.Arguments.[0] :?> LambdaExpression
/// Converts a Lambda quotation into a Linq Lamba Expression with 1 parameter
let ToLinq (exp : Expr<'a -> 'b>) =
let lambda = toLambda exp
Expression.Lambda<Func<'a, 'b>>(lambda.Body, lambda.Parameters)
现在我想转换类型的报价Expr<'a * 'b -> 'c>
或者甚至可能Expr<'a -> 'b -> 'c>
到类型的 Linq Lambda 表达式Expression<Func<'a,'b'c>>
.
我怎样才能做到这一点?
问候,
福尔基
我不确定 F# PowerPack 中提供的 LINQ 模块是否直接支持此功能。但是,您可以对 F# 库生成的 LINQ 表达式进行自己的后处理,将其转换为通常形式的 C# lambda 函数:
以下函数采用 LINQ 表达式,该表达式被构造为多个嵌套LambdaExpression
单个参数的表达式(即 F# 翻译器生成的结构)并返回参数列表和最内层表达式的主体:
let rec translateExpr (linq:Expression) =
match linq with
| :? MethodCallExpression as mc ->
let le = mc.Arguments.[0] :?> LambdaExpression
let args, body = translateExpr le.Body
le.Parameters.[0] :: args, body
| _ -> [], linq
现在你可以用它来获得一个普通的Func
委托类型不正确,例如int -> int -> int -> int
像这样:
let linq = (<@@ fun a b c -> (a + b) * c @@>).ToLinqExpression()
let args, body = translateExpr liq
let f = Expression.Lambda<Func<int, int, int, int>>
(body, args |> Array.ofSeq)
f.Compile().Invoke(10, 11, 2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)