Я не уверен, поддерживается ли это напрямую модулями LINQ, доступными в F # PowerPack. Однако вы можете реализовать собственную постобработку выражения LINQ, созданного библиотеками F #, чтобы превратить его в лямбда-функцию C # обычной формы:
Следующая функция принимает выражение 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)