3

在操作通过 FSharp.Data.SqlClient 检索的数据时,使用查询表达式而不是序列模块有什么优势吗?

例如:

query{
    for row in SelectAllCategories.Execute() do
    where row.Id = 1
    select {
        Id = row.Id;
        Category = row.CategoryName
    }
}

相对

SelectAllCategories.Execute()
|> Seq.filter (fun x -> x.Id = 1)
|> Seq.map (fun x ->
                {
                   Id = x.Id;
                   Category = x.CategoryName
                }

就此而言,您甚至可以考虑使用 LINQ。那么,如果有的话,有什么优势,特别是在 FSharp.Data.SqlClient 方面?

4

2 回答 2

5

在这种特殊情况下,FSharp.Data.SqlClient提供默认IEnumerable<ProvidedType>.Record结果类型,而不是IQueryable<ProvidedType>任何类型。所有与 SQL 引擎的通信对于查询表达式都是不透明的,被封装到提供的SqlCommandProvider.Execute()方法中。query {...}因此,使用 Linq-to-Sql 的任何潜在好处都不会在这里发挥作用。

Seq因此,与与查询表达式相关的底层脱糖机制相比,使用模块中的函数的情况会产生更好的性能和更少的开销,我不会感到惊讶。在这里使用查询表达式没有任何好处。

于 2015-09-12T21:26:49.903 回答
2

查询生成器提供了一种IQueryables在 F# 中构造的方法,Seq模块函数可以工作IEnumerables(该seq类型是别名)。这些是通用的 .NET 接口,而不是 F# 接口,它们之间的区别在此处进行了很好的概述。

此外,除了Seq模块功能之外,您还拥有seq构建器:

seq {
   for row in SelectAllCategories.Execute() do 
       if row.Id = 1 then 
           yield { Id = row.Id; Category = row.CategoryName }
}

它大致相当于使用Seq模块函数,因此选择一个而不是另一个主要是一种风格或方便的决定。

于 2015-09-12T20:23:45.813 回答