是否可以从 F# 使用 LINQ 以及如何使用?
Is it possible to use LINQ from F# and how?
为了访问一些 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));
加载方法的签名是(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 : ListCollection
和list : List
这是未经测试的,因为我没有 SharePoint 服务器,但是...
open System.Linq.Expressions
type Expr =
static member Quote(e:Expression<System.Func<_, _>>) = e
将允许您从 F# lambda 生成 Linq 表达式,但您还需要在 lambda 参数上提供类型注释并将 return 类型转换为 '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))
为了访问一些 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));
加载方法的签名是(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 : ListCollection
和list : List
这是未经测试的,因为我没有 SharePoint 服务器,但是...
open System.Linq.Expressions
type Expr =
static member Quote(e:Expression<System.Func<_, _>>) = e
将允许您从 F# lambda 生成 Linq 表达式,但您还需要在 lambda 参数上提供类型注释并将 return 类型转换为 '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))