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

时间:2016-07-05 08:27:22

标签: c# linq sharepoint f# c#-to-f#

为了访问某些SharePoint数据,我使用了Microsoft.SharePoint.Client库,该库公开了以下API。 C#(link)中有一些示例用法,其中包含以下代码段:

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编译器期望第二个参数类型为

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

允许您从F#lambdas创建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))