LINQ(或 linq)是一个利基工具,还是正在成为基础工具?
Posted
技术标签:
【中文标题】LINQ(或 linq)是一个利基工具,还是正在成为基础工具?【英文标题】:Is LINQ (or linq) a niche tool, or is it on the path to becoming foundational? 【发布时间】:2009-08-01 19:16:26 【问题描述】:在阅读“What is the Java equivalent of LINQ?”之后,我想知道,是(小写)语言集成查询 - 换句话说,能够使用简洁的语法对对象集合或外部存储执行查询 - 将是大多数通用语言的未来之路?还是 LINQ 是一项有趣的技术,仍将局限于 Microsoft 语言?介于两者之间?
编辑:我不知道其他语言,但在我学习的过程中,LINQ 似乎既不是史无前例的,也不是独一无二的。 LINQ 中的思想 - lambda 和查询 - 存在于其他语言中,并且这些思想似乎正在传播。
【问题讨论】:
【参考方案1】:在 LinQ 之前,Python 有 Generator Expressions,这是对集合执行查询的特定语法。 Python 的语法比 Linq 的更精简,但让您基本上可以像在 linq 中一样简单地执行相同的查询。几个月前,我写了一个blog post comparing queries in C# and Python,这里是一个小例子:
C# Linq:
var orders = from c in customers
where c.Region == "WA"
from o in c.Orders
where o.OrderDate >= cutoffDate
select new c.CustomerID, o.OrderID;
Python 生成器表达式:
orders = ( (c.customer_id, o.order_id)
for c in customers if c.region == 'WA'
for o in c.orders if o.date >= cutoff_date)
编程语言中的查询语法是一个非常有用的工具。我相信每种语言都应该包含类似的内容。
【讨论】:
列出一些其他类似的功能:Haskell 具有列表推导(任何 Python 程序员都可能立即将它们识别为生成器); Scala 也有类似的东西。 Linq 还可以做比这更复杂的事情【参考方案2】:多年后
手工制作数据库访问(用这么多语言) 通过实体框架 通过当月流行的 ORM 获取和存储数据是时候 somone 开发一种易于访问和语言集成的方式来与数据库对话了。 LINQ to SQL 应该是多年前制作的。我为提出它的团队鼓掌 - 最后是一个有意义的数据库访问框架。
目前还不完美,我目前主要的头疼是其他常见数据库没有真正支持 LINQ2SQL,Java 也没有类似的支持。
(顺便说一句,LINQ 也很好,不仅仅是 LINQ to SQL :-)
【讨论】:
实体框架怎么样?它可以支持任何类型的数据库,您只需要足够的提供者 “足够的提供者”是一些数据库的问题。它们不存在,或者尚未准备好生产。【参考方案3】:我想说,任何语言的集成查询技术都将及时成为基础,特别是考虑到最近对函数式编程语言的兴趣上升。
无论如何,LINQ 无疑是我个人坚持使用 .NET 的最大原因之一 - 它已成为我个人的基础,我敢打赌很多开发人员也会有这种感觉。
【讨论】:
【参考方案4】:我认为作为 LINQ 基础的函数式概念将在许多语言中流行起来。通过一组函数传递一系列对象以获得所需的对象集。本质上,使用 lambda 语法而不是查询语法。
这是一种非常强大且富有表现力的编码方式。
这并不是因为我觉得它是一种从根本上更好的做事方式(即 lambda 优于查询语法)。相对而言,将查询表达式的底层库支持添加到语言中比添加查询语法要容易得多。查询所需的 lambda 语法是
Lambdas 基础查询方法大多数新语言都支持 lambda(甚至 C++ 也终于有了它们!)。添加库支持相当便宜,通常可以由有动力的个人完成。
将查询语法融入语言需要更多的工作。
【讨论】:
【参考方案5】:免责声明:我从未使用过 LINQ。如果我错了,请纠正我。
许多语言的结构允许使用语言数据类型实现与 LINQ 相同的事情。 显然,最有趣的特性是 LINQ 构造可以转换为 SQL,但它并不特定于 LINQ:http://www.aminus.org/blogs/index.php/2008/04/22/linq-in-python?blog=2。
【讨论】:
澄清一下,LINQ-to-SQL 和 LINQ-to-entities(您所指的可以将 LINQ 表达式转换为数据库查询的技术)构建在 LINQ 之上。从本质上讲,LINQ 只是一种特定于语言的方式,用于链接对特定接口上的扩展方法的调用。 很多语言都有select语句,where子句?我不知道有那么多。面向数据库的语言,是的。但是通用的呢?珀尔? Python? Java,我从我引用的问题中猜想,没有。你能举一些例子吗? Python 没有select
语句或where
子句,但列表和生成器理解做同样的事情。列表推导式在函数式语言中非常常见。
我认为列表和生成器推导是用于创建列表和枚举,而不是使用它们。虽然我认为 LINQ 确实有点消耗和创建它们......
首先我听说了术语列表推导。我查看了en.wikipedia.org/wiki/List_comprehension,它看起来像列表推导是 select+where 子句。【参考方案6】:
我认为linq不会局限于microsoft语言,看看吧,php已经有东西了,看看http://phplinq.codeplex.com/
我认为 Linq 在开发过程中是一个很棒的工具,如果能将它转移到其他语言(比如我的 php 示例中),我个人会非常高兴
【讨论】:
【参考方案7】:我不认为你真的可以把它(或很多东西)归类为两者。虽然我很难说 LINQ 是一个利基工具——它对很多人有很多应用——但它不是“基础”IMO。但是,我也不会说拥有 LINQ(或等效的)特定于语言的查询语言在游戏的这个阶段是真正的基础。也许在未来,但现在您可以用许多不同的方式构建查询,从而产生显着不同的性能水平。
【讨论】:
【参考方案8】:对我来说,这听起来很像 Ruby 的 Active Record,但我从未使用过 LINQ。有人用过吗? (我会将此作为评论发布,但我真的很想更新答案——我可能错了,所以它会被否决:))
(其实我应该说AR就像LINQ to SQL,据我所知他们还没有为其他目标实现AR)
【讨论】:
看,这就是问题所在。我知道 LINQ,但不知道 AR。你知道 AR 但不知道 LINQ。试图弄清楚它们在哪里相似,它们在哪里不同,并不是那么容易。啊。 AR 和 LINQ 是真正正交的,甚至可以一起使用。 LINQ 让您可以直接用您的源语言编写 SQLesque 语句,并且具有类型安全性和一切功能。这些语句然后由一些提供者解释。 ActiveRecord 只是意味着对象和行之间存在 1-1 映射,每个对象负责保存自己。 LINQ 查询可能会返回此类对象的集合。 Active Record 有一个内置的查询系统,可以自动在其母语和 SQL 之间进行转换。 AR 还会根据数据库表自动创建类。因此,根本没有代码,您几乎可以说“user.find(name="Bill")”并获得字段名称等于 Bill 的用户对象集合(语法几乎肯定是错误的,因为我没有使用过Ruby 几年了)。更高级的查询也是可能的。类型安全与 Ruby 无关。 LINQ 更像是 Ambition 而不是 ActiveRecord。 Ambition 是 Ruby 的查询 DSL。您使用标准化语言编写查询,Ambition 有适配器,可以为 SQL、LDAP、XQuery、Flickr 翻译查询,应有尽有。 LINQ 和 Ambition 之间的区别在于,由于 Ruby 的表达能力,无需等到 Microsoft 将 LINQ 从山顶上推出:Ambition 与其他任何库一样只是一个 Ruby 库。它只是将 Enumerable/Array/Hash 上已经存在的过滤方法(选择、检测、拒绝、查找、find_all、any?、all?)扩展到任意的类似集合的东西。以上是关于LINQ(或 linq)是一个利基工具,还是正在成为基础工具?的主要内容,如果未能解决你的问题,请参考以下文章
Linq to SQL 还是 Linq to DataSet?