在其他编程语言中,我见过Map和Reduce,它们是函数式编程的基石。我找不到LINQ为什么具有Aggregate
(与Reduce
)和Select
(与Map
)相同的任何理由或历史?
我问的原因是我花了一段时间才明白这是一回事,我很好奇这是什么原因。
在其他编程语言中,我见过Map和Reduce,它们是函数式编程的基石。我找不到LINQ为什么具有Aggregate
(与Reduce
)和Select
(与Map
)相同的任何理由或历史?
我问的原因是我花了一段时间才明白这是一回事,我很好奇这是什么原因。
Answers:
这主要归结于LINQ的历史。
LINQ 最初旨在像SQL一样,并且(尽管不是专门地)用于连接到SQL数据库。这导致其许多术语都基于SQL。
所以,“选择”从SQL来select
声明,而“总”从SQL聚合函数来(例如count
,sum
,avg
,min
,max
)。
对于那些质疑LINQ最初与SQL的关联程度的人,我将参考(例如)微软有关Cω的文章,这是微软研究院设计的一种语言,似乎是大多数LINQ基础工作的地方在将它们添加到C#和.NET之前。
Cω中的查询运算符
Cω在C#语言中添加了两大类查询运算符:
-基于XPath的运算符,用于按名称或类型查询对象的成员变量。
-基于SQL的运算符,用于执行复杂的查询,包括对来自一个或多个对象的数据进行投影,分组和联接。
至少据我所知,基于XPath的运算符从未被添加到C#中,仅留下了被证明(在LINQ存在之前)直接基于SQL的运算符。
现在,LINQ与Cω中基于SQL的查询运算符并不完全相同。特别是,LINQ遵循C#的基本对象,并且函数调用语法比Cω更紧密。Cω查询甚至更严格地遵循SQL语法,因此您可以编写如下内容(同样,直接从上面链接的文章中得出):
rows = select c.ContactName, o.ShippedDate
from c in DB.Customers
inner join o in DB.Orders
on c.CustomerID == o.CustomerID;
是的,同一篇文章确实专门讨论了使用基于SQL的查询来查询来自实际SQL数据库的数据:
若要连接到Cω中的SQL数据库,它必须作为托管程序集(即.NET库文件)公开,然后由应用程序引用。通过使用sql2comega.exe命令行工具或Visual Studio中的“ 添加数据库架构...”对话框,可以将关系数据库作为托管程序集暴露给Cω 。Cω使用数据库对象表示服务器托管的关系数据库。甲数据库对象具有用于每个表或视图,以及用于在数据库中找到的每个表值函数的方法的公共属性。要查询关系数据库,必须将表,视图或表值函数指定为一个或多个基于SQL的运算符的输入。
下面的示例程序和输出显示了使用基于SQL的运算符查询Cω中的关系数据库的一些功能。本示例中使用的数据库是Microsoft SQL Server附带的示例Northwind数据库。在示例中使用的名称DB指的是使用sql2comega.exe生成的Northwind.dll程序集的Northwind命名空间中Database对象的全局实例。
因此,是的,从一开始(或什至在开始之前,取决于您的观点),LINQ就明确基于SQL,并且专门用于允许访问SQL数据库中的数据。
for
循环,Haskell的外观像是C风格的命令性代码块,因此Scala称其为monadic运算flatMap
,而Haskell则return
出于相同的原因:与防止出现的“幻觉”相适应(前)命令式程序员。
对我而言,“选择并汇总”更有意义。随着实体成为.Net中查询和处理数据的主要方法,Linq越来越多地被可能习惯于通过SQL处理数据的开发人员使用。因此,对于那些开发人员来说,使用“选择”之类的词更有意义,因为它们是他们惯用的关键字。
INNER JOIN
在Entity Framework不能选择的情况下完成一天。可能恰恰相反。每天越来越多的人积极使用LINQ来避免编写SQL。熟悉SQL的人可能只会在SQL上做更多的事情。