将Linq转换为FSharp表达式

时间:2014-12-16 14:58:04

标签: linq f#

DocumentDB在C#中有一个步行和示例项目,我正在FSharp中完成。第一个任务之一是找到现有的数据库。 C#代码就是这个

var database = client.CreateDatabaseQuery().Where(db => db.Id == "FamilyRegistry").ToArray().FirstOrDefault();

我正在尝试在FSharp中执行相同的操作,但即使我引用了相同的库,我也没有获得.Where。相反,我得到了这个:

enter image description here

我是否认为这个问题错了?提前谢谢。

1 个答案:

答案 0 :(得分:14)

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 ""
    

    seq<'T>IEnumerable<T>的同义词,因此如果将方法应用于IQueryable,它将强制执行查询。

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

    let countOfStudents =
        query {
            for student in db.Student do
            select student
            count
        }
    

    query会返回正确的IQueryable<T>

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

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