【问题标题】:Is it possible to use LINQ from F# and how? [duplicate]是否可以使用 F# 中的 LINQ 以及如何使用? [复制]
【发布时间】:2016-07-05 20:32:17
【问题描述】:

为了访问一些 SharePoint 数据,我使用了 Microsoft.SharePoint.Client 库,它公开了以下 api。在 C# (link) 中有示例用法,其中的 sn-p 如下:

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

【问题讨论】:

  • 这个问题的给定答案对 Sharepoint 开发人员尤其有用。它包含有关 F# lambdas to LINQ 的更一般问题中不存在的关键细节。投票重新开放。

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


【解决方案1】:

这是未经测试的,因为我没有 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))

【讨论】:

  • 像魅力一样工作。非常感谢!
猜你喜欢
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 2016-01-21
  • 2015-10-22
相关资源
最近更新 更多