首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用查询表达式vs Seq模块?

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

Stack Overflow用户
提问于 2015-09-12 20:09:08
回答 2查看 244关注 0票数 3

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

例如:

代码语言:javascript
复制
query{
    for row in SelectAllCategories.Execute() do
    where row.Id = 1
    select {
        Id = row.Id;
        Category = row.CategoryName
    }
}

对比

代码语言:javascript
复制
SelectAllCategories.Execute()
|> Seq.filter (fun x -> x.Id = 1)
|> Seq.map (fun x ->
                {
                   Id = x.Id;
                   Category = x.CategoryName
                }

对于这个问题,您甚至可以考虑LINQ。那么,如果有什么优势,特别是在FSharp.Data.SqlClient方面,有什么好处呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-12 21:26:49

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

因此,与与查询表达式相关联的底层设计机器相比,使用Seq模块的函数可以获得更好的性能,并且具有更少的开销,这一点我并不感到惊讶。这里没有使用查询表达式的优点。

票数 5
EN

Stack Overflow用户

发布于 2015-09-12 20:23:45

查询生成器提供了一种在IQueryables中构造F#的方法,Seq模块函数在IEnumerables上工作( seq类型是IEnumerables的别名)。这些是通用的.NET接口,而不是F#接口,它们之间的差异可以很好地概括出来,例如here

此外,除了Seq模块函数之外,还有seq构建器:

代码语言:javascript
复制
seq {
   for row in SelectAllCategories.Execute() do 
       if row.Id = 1 then 
           yield { Id = row.Id; Category = row.CategoryName }
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32543234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档