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 : ListCollection和list : List
这是未经测试的,因为我没有 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)
| 归档时间: |
|
| 查看次数: |
663 次 |
| 最近记录: |