2016-07-05 44 views
3

为了访问一些SharePoint数据,我使用了公开以下api的Microsoft.SharePoint.Client库。有在C#(link)从作为下面的代码片断示例用法:是否可以使用F#中的LINQ以及如何操作?

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)); 

Load方法的签名(link

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

Fsharp编译期望第二paramater为类型

Linq.Expressions.Expression<Func<'a,obj>> 

Linq.Expressions.Expression<Func<'a,obj>> []  

我可以使用F#中的Load方法吗?

有一个相关的答案here 但我不能将给出的代码示例解决方案转换为上面的c#示例。 也许你可以帮忙吗? 涉及的类型是list : ListCollectionlist : List

回答

4

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

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

将允许您从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) 

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

context.Load(web.Lists, 
    Expr.Quote(fun (lists : ListCollection) -> lists.Include(getTitle, getId) :> obj)) 
+0

就像一个魅力。非常感谢 ! – fbehrens

相关问题