将Linq转换为FSharp表达式

Jam*_*xon 4 linq f#

DocumentDB在C#中有一个walk-though和示例项目,我正在FSharp中完成.第一个任务之一是找到现有的数据库.C#代码是这样的

var database = client.CreateDatabaseQuery().Where(db => db.Id == "FamilyRegistry").ToArray().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

我试图在FSharp中做同样的行,但我没有得到.Where,即使我引用相同的库.相反,我得到这个:

在此输入图像描述

我在想这个问题错了吗?提前致谢.

Pan*_*vos 15

Linq并不特定于C#.即使在C#中,你需要添加一个参考System.Linq.dllusing System.Linq;声明.C#项目模板已包含这些语句.

在F#中,您需要执行相同的操作,确保您的项目具有对System.Linq的引用并添加open System.Linq语句

至少有两种惯用方式:

  1. 您可以使用Seq模块的函数与管道运算符实现与方法链接相同的结果,例如:

    let random = new System.Random()
    Seq.initInfinite (fun _ -> random.Next())
    |> Seq.filter (fun x -> x % 2 = 0)
    |> Seq.take 5
    |> Seq.iter (fun elem -> printf "%d " elem)
    printfn ""
    
    Run Code Online (Sandbox Code Playgroud)

    seq<'T>是一个同义词,IEnumerable<T>如果将方法应用于IQueryable,它将强制查询的执行.

  2. 您可以使用Query Expressions,相当于LINQ的类SQL语法:

    let countOfStudents =
        query {
            for student in db.Student do
            select student
            count
        }
    
    Run Code Online (Sandbox Code Playgroud)

    query 返回一个正确的 IQueryable<T>

您的具体查询可能是这样的:

let database =  
    query {
        for db in client.CreateDatabaseQuery()
        where db.Id == "FamilyRegistry"
        select db
        headOrDefault
    }
Run Code Online (Sandbox Code Playgroud)