[英]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一樣高效的東西? (我目前正在評估Python與IronPython和Boo的比較 ,因此可以使用任何一種語言的答案都可以。)
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的實現,但我沒有聽說過任何這樣的功能。
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.