Sto scrivendo uno strumento che richiede dati da una fonte. Questa fonte verrà specificata dall'utente e potrebbe essere qualcosa come un back-end SQL, un database proprietario, un file system piatto, chi lo sa.
Mi piacerebbe che la mia interfaccia recuperi questi tipi di query, utilizzi Linq, poiché sembra la più amichevole di C # e può sfruttare molto codice .NET.
Ho fatto alcune ricerche e ho iniziato creando un IQueryProvider attraverso l'ottimo tutorial qui . Mi ha ottenuto una grande parte del modo, ma ora sono confuso sul modo migliore di fare in modo che gli utenti convertano l'albero delle espressioni nel loro codice personalizzato.
Sto cercando di capire il modo migliore per fornire un'interfaccia semplice per gli utenti per specificare come trasformare un albero di espressioni in "codice" personalizzato (ad esempio, "SQL"), e sembra piuttosto ingombrante e complesso - immagino perché è esattamente quello
La mia domanda è, qual è il modo migliore per convertire un albero di espressione in un linguaggio personalizzato?
Più vicino posso dire che devo usare la classe 'Context' per fare la mia logica di analisi personalizzata, ma l'API che uso sembra piuttosto di basso livello - ci sono operazioni di livello superiore che posso fare per mappare semplicemente le operazioni alle stringhe?
Non esiste un modo semplice o diretto per convertire l'albero delle espressioni in un linguaggio di query personalizzato. Potresti voler provare LinqExtender
http://mehfuzh.github.com/LinqExtender/
Che implementa un modello di visitatore per la conversione tra linq e il tuo dsl.
LinqExtender è un toolkit per la creazione di provider LINQ personalizzati. Fornisce un livello sottratto sull'implementazione IQyeryable e IQueryProvider originale e fornisce un albero di sintassi semplificato. Inoltre, copre internamente cose come proiezione, chiamate di metodo, ordine, analisi dei membri, ecc. Pertanto lo sviluppatore può concentrarsi maggiormente sul suo compito principale meno la complessità
.
In generale, il modo migliore per convertire una struttura ad albero in un'altra forma consiste nell'utilizzare il modello visitatore .
In particolare, controlla la classe ExpressionVisitor su msdn.