您能用Python或Boo之类的语言进行类似LINQ的查询吗?

您能用Python或Boo之类的语言进行类似LINQ的查询吗?,python,linq,linq-to-sql,ironpython,boo,Python,Linq,Linq To Sql,Ironpython,Boo,以这个简单的C LINQ查询为例,假设db.Numbers是一个具有一个列号的SQL表: 这将在C中非常有效地运行,因为它会生成类似于 select Number from Numbers where Number < 5 它没有做的是从数据库中选择所有的数字,然后用C语言过滤它们,就像它一开始可能做的那样 Python支持类似的语法: result = [n.Number for n in Numbers if n.Number < 5] 但是这里的if子句在客户端而不是服务

以这个简单的C LINQ查询为例,假设db.Numbers是一个具有一个列号的SQL表:

这将在C中非常有效地运行,因为它会生成类似于

select Number from Numbers where Number < 5 
它没有做的是从数据库中选择所有的数字,然后用C语言过滤它们,就像它一开始可能做的那样

Python支持类似的语法:

result = [n.Number for n in Numbers if n.Number < 5]
但是这里的if子句在客户端而不是服务器端进行过滤,这效率要低得多


Python中有没有像LINQ那样高效的东西?我目前正在评估Python与IronPython与Boo的对比,因此在任何一种语言中都适用的答案是可以的。

请仔细查看。这可能会做很多你想做的事情。它为您提供了在服务器上运行的普通SQL的Python语法。

LINQ是C和VB.NET的语言特性。它是编译器可以识别并经过特殊处理的特殊语法。它还依赖于另一种称为表达式树的语言特性

表达式树有点不同,因为它们不是特殊的语法。它们的编写方式与任何其他类实例化一样,但编译器确实会通过将lambda转换为运行时的实例化来对它们进行特殊处理。可以在运行时对其进行操作,以生成另一种语言(即SQL)的命令

C和VB.NET编译器采用LINQ语法,将其转换为lambdas,然后将其传递到表达式树实例化中。然后有一组框架类操纵这些树来生成SQL。您还可以找到其他提供LINQ提供程序的库,包括MS生成的库和第三方库,它们基本上会弹出一个不同的AST处理器,以从LINQ生成SQL以外的内容


因此,用另一种语言进行这些操作的一个障碍是它们是否支持运行时AST构建/操作。我不知道Python或Boo的任何实现是否可以实现,但我没有听说过任何这样的功能。

我相信当IronPython 2.0完成后,它将具有LINQ支持,请参阅一些示例讨论。现在,您应该能够编写如下内容:

Queryable.Select(Queryable.Where(someInputSequence, somePredicate), someFuncThatReturnsTheSequenceElement) 
IronPython2.0b4中可能有更好的东西——关于如何处理命名冲突,有很多内容。

在sqlalchemy中,如果您想要一个清晰的单行程序,我想这是python中最快的解决方案。请看这一页

它应该是像

result = [n.Number for n in db.Numbers.filter(db.Numbers.Number < 5).all()]

LINQ的一个关键因素是编译器生成表达式树的能力。 我在Nemerle中使用一个宏,它将给定的Nemerle表达式转换为表达式树对象。 然后我可以将其传递给iQueryTables上的Where/Select/etc扩展方法。 这不是C和VB的语法,但对我来说已经足够接近了

我通过这篇文章的链接得到了Nemerle宏:

应该可以为Boo创建类似的宏。然而,考虑到您需要支持的一大组可能的表达式,这是相当多的工作。 Ayende在这里给出了概念证明:
Boo支持使用与python相同语法的列表生成器表达式。有关这方面的更多信息,请查看和上的Boo文档。

IronPython2.0刚刚完成,我想说的是,我们目前不支持LINQ。Nemerle支持LINQ表达式,比如C,甚至更多:。例如,使用Linq:def xs=[1,1,aaa,2,2,aaa]支持Nemerle元组;def xs=xs.AsQueryable;def res=linq<从xs中的p选择p[0]>。NToList;
result = [n.Number for n in db.Numbers.filter(db.Numbers.Number < 5).all()]