0

我是 F# 的新手,正在尝试重新创建我过去使用 C# 或 Powershell 构建的一些简单应用程序。我正在尝试获取网络的多个属性。在 F# 中,我可以获取单个属性,但我不确定用于一次获取多个属性的语法。

举个例子:

// F# Example
context.Load(web |> fun w->w.Lists)
context.Load(web |> fun w->w.AssociatedOwnerGroup)
context.ExecuteQuery()

F# 中有没有办法将它组合成一行?在 C# 中,我会这样称呼它:

// C# Example
context.Load(web, w => w.Lists, w => w.AssociatedOwnerGroup);
context.ExecuteQuery();
4

1 回答 1

0

看起来您正在调用的函数 is ClientRuntimeContext.Load<T>,它具有以下 C# 签名:

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

这里有两个问题使得这个函数难以从 F# 调用:params数组和自动转换为 LINQ 表达式。F# 分别支持这些,但是当您有多个参数时,自动转换似乎不起作用。相反,我认为您必须手动进行,如下所示:

// automatically quotes a function
type Expr = 
    static member Quote<'t>(f : Expression<Func<'t, obj>>) = f

// quote the functions
let funcs =
    [|
        fun (w : SPWeb) -> w.Lists
        fun (w : SPWeb) -> w.AssociatedOwnerGroup
    |] |> Array.map Expr.Quote

// call the Load function
context.Load(web, funcs)

对不起,我知道那很丑。可能有更好的方法来做到这一点,但我不知道它是什么。

于 2021-03-18T01:10:53.193 回答