Linq 使用查询表达式vs Seq模块?

Linq 使用查询表达式vs Seq模块?,linq,f#,fsharp.data.sqlclient,Linq,F#,Fsharp.data.sqlclient,在处理通过FSharp.data.SqlClient检索的数据时,使用查询表达式比使用序列模块有什么优势吗 例如: query{ for row in SelectAllCategories.Execute() do where row.Id = 1 select { Id = row.Id; Category = row.CategoryName } } 对 SelectAllCategories.Execute() |>

在处理通过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?

查询生成器提供了一种在F#中构造
IQueryables
的方法,
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
模块函数,因此选择其中一个主要是一种风格或方便的决定。

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


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

我应该澄清我的问题。我的理解是,FSharp.Data.SqlClient在调用时会返回一个序列,因此使用查询表达式语法有什么意义或好处呢?我会说没有,当没有什么可以解释查询时,使用
IQueryable
是没有意义的。所以这也是我的理解。不过,我不是
FSharp.Data.SqlClient
方面的专家。