在操作通过FSharp.Data.SqlClient检索的数据时,在Sequence模块上使用查询表达式有什么好处吗?
例如:
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?
答案 0 :(得分:5)
在这种特殊情况下,FSharp.Data.SqlClient
提供默认的IEnumerable<ProvidedType>.Record
结果类型,而不是任何类型的IQueryable<ProvidedType>
。与SQL引擎的所有通信对查询表达式都是不透明的,被封装到提供的SqlCommandProvider.Execute()
方法中。因此,query {...}
使用Linq-to-Sql的任何潜在好处都没有在这里发挥作用。
因此,与Seq
模块中的函数的情况相比,与查询表达式相关的基础desugared机制产生的开销更少,我不会感到惊讶。这里没有使用查询表达式的优点。
答案 1 :(得分:2)
“查询”构建器提供了一种在F#中构造IQueryables
的方法,Seq
模块函数在IEnumerables
上工作(seq
类型是别名)。这些是通用的.NET接口而不是F#的东西,它们之间的差异很好地概括为例如here。
此外,除Seq
模块功能外,您还拥有seq
构建器:
seq {
for row in SelectAllCategories.Execute() do
if row.Id = 1 then
yield { Id = row.Id; Category = row.CategoryName }
}
它大致相当于使用Seq
模块函数,因此选择其中一个主要是一种风格或方便的决定。