簡體   English   中英

你能用Python或Boo這樣的語言進行類似LINQ的查詢嗎?

[英]Can you do LINQ-like queries in a language like Python or 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 

沒有做的是從數據庫中選擇所有數字,然后在C#中過濾它們,因為它可能在最初時看起來像。

Python支持類似的語法:

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

但是這里的if子句在客戶端而不是服務器端進行過濾,效率低得多。

Python中有沒有像LINQ一樣高效的東西? (我目前正在評估PythonIronPythonBoo的比較 ,因此可以使用任何一種語言的答案都可以。)

sqlalchemy中的sqlsoup為您提供了python中最快的解決方案我想如果你想要一個明確的(ish) 單線程 看看頁面看看。

它應該像......

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

仔細看看SQLAlchemy 這可能會做你想要的很多事情。 它為您提供了在服務器上運行的普通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) 

更好的東西可能已經進入IronPython 2.0b4 - 目前有很多關於如何處理命名沖突的討論

LINQ的一個關鍵因素是編譯器生成表達式樹的能力。 我在Nemerle中使用一個宏,它將給定的Nemerle表達式轉換為Expression樹對象。 然后我可以將它傳遞給IQueryables上的Where / Select / etc擴展方法。 它不是C#和VB的語法,但它對我來說足夠接近。

我通過這篇文章的鏈接獲得了Nemerle宏: http//groups.google.com/group/nemerle-dev/browse_thread/thread/99b9dcfe204a578e

應該可以為Boo創建一個類似的宏。 然而,考慮到您需要支持的大量可能表達式,這是相當多的工作。 Ayende在這里給出了一個概念證明: http//ayende.com/Blog/archive/2008/08/05/Ugly-Linq.aspx

Boo使用與python相同的語法支持列表生成器表達式。 有關它的更多信息,請查看有關Generator表達式列表推導的Boo文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM