Frage

Nehmen Sie

Das einfache C # LINQ query, und sich vorstellen, dass db.Numbers ist ein SQL Tabelle mit einer Spalte Number:

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

Dieses sehr effizient laufen in C # , weil es erzeugt ein SQL Abfrage so etwas wie

select Number from Numbers where Number < 5 

Was es nicht zu tun ist wählen Sie alle die Zahlen aus der Datenbank, und filtern sie dann in C # , wie es erscheinen könnte zunächst zu tun.

Python unterstützt eine ähnliche Syntax:

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

Aber es die if Klausel hier funktioniert die Filterung auf der Client-Seite, anstatt die Server-Seite, die viel weniger effizient ist.

Gibt es etwas, so effizient wie LINQ in Python ? (Ich bin zur Zeit der Bewertung Python vs. Ironpython vs. Boo , so eine Antwort, die in jeder dieser Sprachen funktioniert, ist in Ordnung.)

War es hilfreich?

Lösung

Ich glaube, dass, wenn Ironpython 2.0 abgeschlossen ist, wird es LINQ-Unterstützung (siehe dieses Themas für einige Beispiel Diskussion). Gerade jetzt sollten Sie in der Lage sein, etwas zu schreiben wie:

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

Etwas besser könnte es in Ironpython 2.0b4 gemacht - es gibt eine Menge von aktuelle Diskussion darüber, wie Namenskonflikte behandelt wurden.

Andere Tipps

sqlsoup in sqlalchemy gibt Ihnen die schnellste Lösung in Python Ich denke, wenn Sie wollen ein klarer (Ish) ein Liner. Schauen Sie sich die Seite zu sehen.

Es sollte so etwas wie ...

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

LINQ ist eine Sprache-Funktion von C # und VB.NET. Es ist eine spezielle Syntax vom Compiler erkannt und speziell behandelt. Es ist auch abhängig von einer anderen Sprache Funktion namens Ausdruck Bäume.

Expression Bäume sind eine kleine unterschiedlich, dass sie nicht spezielle Syntax. Sie sind wie jede andere Klasse Instanziierung geschrieben, aber der Compiler sich unter der Decke speziell tut behandeln, die durch ein Lambda in eine Instanziierung einer Laufzeit abstrakter Syntaxbaum . Diese können zur Laufzeit manipuliert werden, um einen Befehl in einer anderen Sprache zu erzeugen (das heißt SQL).

Die C # und VB.NET Compiler nehmen LINQ-Syntax, und in lambdas drehen, dann die in Ausdrucksbaum instantiations passieren. Dann gibt es eine Reihe von Framework-Klassen, die diese Bäume manipulieren SQL zu erzeugen. Sie können auch andere Bibliotheken finden, sowohl MS-produziert und Dritten, das Angebot „LINQ-Provider“, die im Grunde in einem anderen AST processer Pop etwas von der LINQ andere als SQL zu erzeugen.

So ein Hindernis, diese Dinge in einer anderen Sprache zu tun, ist die Frage, ob sie die Laufzeit AST Gebäude / Manipulation unterstützen. Ich weiß nicht, ob irgendwelche Implementierungen von Python oder Boo tun, aber ich habe nicht von solchen Funktionen gehört.

Schauen Sie genau auf SQLAlchemy . Dies kann wahrscheinlich nicht viel von dem, was Sie wollen. Es gibt Ihnen Python-Syntax für Normal alte SQL, die auf dem Server ausgeführt wird.

Ein Schlüsselfaktor für LINQ ist die Fähigkeit des Compilers Ausdrucksbaum zu erzeugen. Ich bin mit einem Makro in Nemerle, die einen bestimmten Nemerle Ausdruck in einen Ausdruck Baumobjekt umwandelt. Ich kann dies dann passieren zu den Wo / Select / etc Erweiterungsmethoden auf IQueryables. Es ist nicht ganz die Syntax von C # und VB, aber es ist nah genug für mich.

Ich habe das Nemerle Makro über einen Link zu diesem Beitrag: http://groups.google.com/group/nemerle-dev/ browse_thread / thread / 99b9dcfe204a578e

Es sollte möglich sein, ein ähnliches Makro für Boo zu erstellen. Es ist ziemlich viel Arbeit aber angesichts der großen Menge der möglichen Ausdrücke, die Sie unterstützen müssen. Ayende hat ein Proof of Concept hier gegeben: http://ayende.com/Blog/archive/2008/ 05.08 / hässlich-Linq.aspx

Boo unterstützt Listengenerator Ausdrücke die gleiche Syntax wie Python verwenden. Für weitere Informationen über das, überprüfen Sie die Boo Dokumentation heraus Generator Ausdrücke und Liste Comprehensions .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top