代码之家  ›  专栏  ›  技术社区  ›  apenwarr

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

  •  4
  • apenwarr  · 技术社区  · 17 年前

    就这么简单吧 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 
    

    什么事 你要做的就是选择 全部的 C# ,一开始似乎是这样。

    支持类似的语法:

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

    但它是 if

    有没有比这更有效的方法 林克 python vs。 铁蟒 vs。 喝倒采 ,因此,任何一种语言的答案都可以。)

    6 回复  |  直到 7 年前
        1
  •  6
  •   David Raznick    17 年前

    sqlsoup 在sqlalchemy中,如果您想要一个清晰(ish)的单行程序,我认为它可以为您提供python中最快的解决方案。请看这一页。

    result = [n.Number for n in db.Numbers.filter(db.Numbers.Number < 5).all()]
    
        2
  •  5
  •   Chris Ammerman    17 年前

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

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

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

        3
  •  5
  •   jfs    17 年前

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

        4
  •  4
  •   Tony Meyer    17 年前

    this thread 例如讨论)。现在,您应该能够编写如下内容:

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

    current discussion 关于如何处理命名冲突。

        5
  •  1
  •   Andrew Davey    17 年前

    LINQ的一个关键因素是编译器生成表达式树的能力。 我在Nemerle中使用一个宏,它将给定的Nemerle表达式转换为表达式树对象。 然后我可以将其传递给iQueryTables上的Where/Select/etc扩展方法。

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

    应该可以为Boo创建类似的宏。然而,考虑到您需要支持的一大组可能的表达式,这是相当多的工作。 http://ayende.com/Blog/archive/2008/08/05/Ugly-Linq.aspx

        6
  •  1
  •   Marcus Griep    17 年前

    Boo支持使用与python相同的语法的列表生成器表达式。有关这方面的更多信息,请查看上的Boo文档 Generator expressions List comprehensions .