你能用Python或Boo这样的语言进行类似LINQ的查询吗?

时间:2008-09-22 21:24:01

标签: python linq linq-to-sql ironpython boo

采用这个简单的 C#LINQ 查询,并假设db.Numbers是一个 SQL 表,其中包含一列Number

var result = 
    from n in db.Numbers
        where n.Number < 5
        select n.Number;

这将在 C#中非常有效地运行,因为它会生成 SQL 查询,如

select Number from Numbers where Number < 5 

做的是从数据库中选择 all 数字,然后在 C#中过滤它们,因为它可能会出现先做。

Python 支持类似的语法:

result = [n.Number for n in Numbers if n.Number < 5]

但是这里的if子句在客户端而不是服务器端进行过滤,效率低得多。

Python 中的 LINQ 是否有效? (我目前正在评估 Python IronPython Boo ,因此可以使用任何一种语言的答案都可以。)< / p>

6 个答案:

答案 0 :(得分:6)

sqlalchemy中的

sqlsoup为您提供了python中最快的解决方案我认为如果您想要一个明确的(ish)单线程。看看页面看看。

它应该像......

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

答案 1 :(得分:5)

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

答案 2 :(得分:5)

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

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

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

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

答案 3 :(得分:4)

我相信当IronPython 2.0完成后,它将获得LINQ支持(有关示例讨论,请参阅this thread)。现在你应该可以写下这样的东西:

Queryable.Select(Queryable.Where(someInputSequence, somePredicate), someFuncThatReturnsTheSequenceElement) 

更好的东西可能会变成IronPython 2.0b4 - 关于如何处理命名冲突有很多current discussion

答案 4 :(得分:1)

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

我通过这篇文章的链接得到了Nemerle宏: http://groups.google.com/group/nemerle-dev/browse_thread/thread/99b9dcfe204a578e

应该可以为Boo创建一个类似的宏。然而,考虑到您需要支持的大量可能表达式,这是相当多的工作。 艾恩德在这里给出了一个概念证明: http://ayende.com/Blog/archive/2008/08/05/Ugly-Linq.aspx

答案 5 :(得分:1)

Boo使用与python相同的语法支持列表生成器表达式。有关详细信息,请查看Generator expressionsList comprehensions上的Boo文档。