Linq 使用查询表达式vs Seq模块?
在处理通过FSharp.data.SqlClient检索的数据时,使用查询表达式比使用序列模块有什么优势吗 例如: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() |>
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
方面的专家。