2016-07-05 74 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

相關問題