Domanda

Prendi questa semplice query C # LINQ e immagina che db.Numbers sia una tabella SQL con una colonna Number :

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

Questo funzionerà in modo molto efficiente in C # , poiché genera una query SQL simile a

select Number from Numbers where Number < 5 

Ciò che non è selezionare tutti i numeri dal database, quindi filtrarli in C # , come potrebbe apparire da fare all'inizio.

Python supporta una sintassi simile:

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

Ma qui la clausola if esegue il filtro sul lato client, piuttosto che sul lato server, che è molto meno efficiente.

Esiste qualcosa di efficace come LINQ in Python ? (Attualmente sto valutando Python rispetto a IronPython rispetto a Boo , quindi una risposta che funziona in una di quelle lingue va bene.)

È stato utile?

Soluzione

Credo che quando IronPython 2.0 sarà completo, avrà il supporto LINQ (vedi questa discussione per alcune discussioni di esempio). In questo momento dovresti essere in grado di scrivere qualcosa del tipo:

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

Qualcosa di meglio potrebbe averlo trasformato in IronPython 2.0b4 - ci sono molti discussione corrente su come sono stati gestiti i conflitti di denominazione.

Altri suggerimenti

sqlsoup in sqlalchemy ti offre la soluzione più rapida in pitone penso che se vuoi una chiara (ish) una fodera. Guarda la pagina per vedere.

Dovrebbe essere qualcosa come ...

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

LINQ è una funzione del linguaggio di C # e VB.NET. È una sintassi speciale riconosciuta dal compilatore e trattata in modo speciale. Dipende anche da un'altra caratteristica del linguaggio chiamata alberi delle espressioni.

Gli alberi delle espressioni sono un po ' piccoli diversi in quanto non sono sintassi speciali. Sono scritti proprio come qualsiasi altra istanza di classe, ma il compilatore li tratta in modo speciale sotto le copertine trasformando un lambda in un'istanza di un runtime albero di sintassi astratto . Questi possono essere manipolati in fase di esecuzione per produrre un comando in un'altra lingua (ad esempio SQL).

I compilatori C # e VB.NET prendono la sintassi LINQ e la trasformano in lambdas, quindi li passano nelle istanze dell'albero delle espressioni. Quindi ci sono un sacco di classi di framework che manipolano questi alberi per produrre SQL. Puoi anche trovare altre librerie, sia prodotte da MS che di terze parti, che offrono "provider LINQ", che fondamentalmente inseriscono un diverso processore AST per produrre qualcosa dal LINQ diverso da SQL.

Quindi un ostacolo a fare queste cose in un'altra lingua è la domanda se supportano la costruzione / manipolazione di AST in fase di esecuzione. Non so se ci siano implementazioni di Python o Boo, ma non ho sentito parlare di tali funzionalità.

Osserva attentamente SQLAlchemy . Questo probabilmente può fare molto di quello che vuoi. Ti dà la sintassi di Python per SQL semplice che viene eseguito sul server.

Un fattore chiave per LINQ è la capacità del compilatore di generare alberi di espressioni. Sto usando una macro in Nemerle che converte una determinata espressione Nemerle in un oggetto dell'albero delle espressioni. Posso quindi passare questo ai metodi di estensione Where / Select / etc su IQueryables. Non è proprio la sintassi di C # e VB, ma è abbastanza vicina per me.

Ho ottenuto la macro Nemerle tramite un link in questo post: http://groups.google.com/group/nemerle-dev/ browse_thread / filetto / 99b9dcfe204a578e

Dovrebbe essere possibile creare una macro simile per Boo. Tuttavia, è un bel po 'di lavoro, data l'ampia serie di possibili espressioni che devi supportare. Ayende ha fornito una prova del concetto qui: http://ayende.com/Blog/archive/2008/ 05/08 / Ugly-Linq.aspx

Boo supporta le espressioni del generatore di elenchi usando la stessa sintassi di Python. Per ulteriori informazioni al riguardo, consulta la documentazione di Boo su Espressioni del generatore e Comprensioni dell'elenco .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top