是否可以使用 F# 中的 LINQ 以及如何使用?

fbe*_*ens 4 c# linq sharepoint f# c#-to-f#

为了访问一些 SharePoint 数据,我使用了 Microsoft.SharePoint.Client 库,它公开了以下 api。C# 中有示例用法(链接),来自以下代码段:

ClientContext context = new ClientContext("http://SiteUrl"); 
Web web = context.Web; 
context.Load(web.Lists, 
             lists => lists.Include(list => list.Title, // For each list, retrieve Title and Id. 
                                    list => list.Id)); 
Run Code Online (Sandbox Code Playgroud)

Load 方法的签名是 (链接)

public void Load<T>(
    T clientObject,
    params Expression<Func<T, Object>>[] retrievals
)
where T : ClientObject
Run Code Online (Sandbox Code Playgroud)

Fsharp 编译器期望第二个参数是类型

Linq.Expressions.Expression<Func<'a,obj>>
Run Code Online (Sandbox Code Playgroud)

或者

Linq.Expressions.Expression<Func<'a,obj>> []    
Run Code Online (Sandbox Code Playgroud)

我可以使用LoadF# 中的方法吗?如何使用?

这里有一个相关的答案 但我无法将给出的代码示例解决方案转换为上述 c# 示例。也许有人可以帮忙?涉及的类型是list : ListCollectionlist : List

mar*_*lam 6

这是未经测试的,因为我没有 SharePoint 服务器,但是...

open System.Linq.Expressions
type Expr = 
    static member Quote(e:Expression<System.Func<_, _>>) = e
Run Code Online (Sandbox Code Playgroud)

将允许您从 F# lambda 生成 Linq 表达式,但您还需要在 lambda 参数上提供类型注释并将返回类型强制转换为 'obj' 以匹配预期的签名。如果您需要重用相同的表达式,则值得定义一些简短的辅助函数来执行此操作。

let getTitle = Expr.Quote(fun (list : List) -> list.Title :> obj)
let getId    = Expr.Quote(fun (list : List) -> list.Id :> obj)
Run Code Online (Sandbox Code Playgroud)

并使用它们来避免函数调用变得不可读

context.Load(web.Lists, 
    Expr.Quote(fun (lists : ListCollection) -> lists.Include(getTitle, getId) :> obj))
Run Code Online (Sandbox Code Playgroud)