Quindi, ho questo nuovo progetto. La mia azienda utilizza la nuvola SalesForce.com per archiviare informazioni sulle operazioni quotidiane. Il mio compito è quello di scrivere una nuova applicazione che, tra le altre cose, integrerà più facilmente le operazioni CRUD di questi dati con le funzionalità delle applicazioni interne esistenti.
Il cuore dell'API WSDL di Salesforce è un insieme di metodi web "query ()" che accettano il comando query sotto forma di stringa. La sintassi della query è SQL-ish, ma non del tutto (lo chiamano SOQL). Non sono un fan delle "stringhe magiche", quindi mi piacerebbe usare Linq nel codebase e analizzare IQueryable nella query SOQL di cui ho bisogno nel wrapper per il servizio. È certamente possibile (L2E, L2Sql), ma mi piacerebbe sapere se c'è una scorciatoia, perché se dico che ci vorrà più di un giorno o due per lanciare il mio, sarò "incoraggiato" a trovare un altro metodo (molto probabilmente un metodo per ogni query di uso generale, che era il metodo utilizzato nelle app precedenti). Se riesco a creare un parser SOQL generico, possiamo usarlo in molte altre app imminenti e sarò un eroe. Anche se ne realizzo uno semplice che supporti solo alcune strutture di query, mi consentirà di procedere con il progetto corrente in modo Linq-y, e potrò espanderlo nel mio tempo libero.
Ecco le opzioni come la vedo io:
Che cosa ne pensate? Costruire un parser Linq più di un compito di due giorni per un ragazzo? Una soluzione completa che coinvolge un provider Linq esistente potrebbe farlo? Sarebbe terribile tagliare la stringa di espressioni e costruire la mia query in questo modo?
EDIT: Grazie a Kirk per la messa a terra. Ho dato un po 'di più un'occhiata a quello che dovrei fare per un parser SOQL di base, ed è appena al di là del mio scopo scrivere codice dell'applicazione scritto su qualsiasi programma possibile. Ad esempio, devo compilare un elenco di selezione dal metodo Select () lambda o uno predefinito da tutte le colonne conosciute dal mio oggetto WSDL, un'attività a cui non avevo nemmeno pensato (mi sono concentrato maggiormente sull'analisi Where) . Sono sicuro che ci sono molte altre "incognite sconosciute" che potrebbero trasformarlo in un grosso problema. Ho trovato diversi collegamenti che mostrano le basi della scrittura di un provider Linq e, sebbene tutti cerchino di renderlo semplice, non sarà fattibile in termini di tempo in questo momento. Strutturerò il mio repository, per ora, usando metodi denominati che incapsulano query denominate (una classe costante di stringhe di query formattabili dovrebbe ridurre la quantità di graffiature nella manutenzione). Non perfetto, ma molto più fattibile. Se e quando un fornitore Linq2SOQL ottiene il terreno, sia in-house che open-source, possiamo refactoring.
Per gli altri che cercano riferimenti al provider Linq, ecco i link utili che ho trovato:
Prendiamoli uno alla volta:
Sembra più difficile per un fornitore Linq2SOQL esistente (il mio Google-fu mi ha deluso qui, o semplicemente non ce n'è uno, l'unico wrapper .NET menziona Linq come un bel-to-have).
Sì, dubito che ne esista già, ma spero che tu possa trovarne uno.
Costruisci un parser ad albero di espressioni. Deve supportare, almeno, le chiamate Select e Where, e deve analizzare i lambda o manipolare i loro corpi metodo per ottenere le operazioni e le proiezioni necessarie. Questo sembra essere un compito piuttosto massiccio, ma come ho detto, è certamente possibile.
Questa è assolutamente la strada da percorrere se sei davvero serio su questo nel lungo periodo.
Racchiudere il servizio in Linq2Sql o un provider Linq esistente simile che mi consentirà di estrarre una stringa di query sufficientemente vicina, correggerla e passarla al servizio. Devono esserci dozzine là fuori (anche se nessuno che sia appena entrato, AFAIK).
Cosa intendi per "drop in"? È possibile ottenere facilmente l'SQL direttamente da L2S.
Chiama Espressione.ToString () (o Expression.DebugView) e manipola quella stringa per creare la query SOQL. Sarà fragile, sarà brutto (dietro le quinte) e supporterà solo ciò che sto cercando esplicitamente, ma fornirà una traduzione rudimentale che mi consentirà di andare avanti.
Vorrei scoraggiarti fortemente da questo approccio, in quanto, almeno, sarà difficile almeno quanto analizzare correttamente gli alberi di espressione. Se non altro, per usare questo, dovresti prima mettere le stringhe analizzate in un modello di oggetto appropriato, cioè gli alberi di espressione esistenti con cui stai iniziando.
In realtà, dovresti pensare a creare un provider di query e farlo nel modo giusto. Penso che due giorni sia un po 'troppo lungo per far funzionare qualcosa anche in un senso primitivo, anche se potrebbe essere possibile. IMO, dovresti studiarne qualcuno a casa e giocarci intorno in modo da avere una certa dimestichezza con i pezzi e le parti di base. Quindi potresti essere a malapena in grado di ottenere alcune domande utilizzabili dopo due giorni.
Onestamente, implementare pienamente questo tipo di progetto è davvero nel regno di diverse settimane, se non mesi, non giorni.
Se questo è troppo lavoro, potresti considerare l'opzione 3. Non sono un esperto di SOQL, quindi non ho idea di quale tipo di lavoro sarebbe implicato nel trasformare le query SQL ordinarie in query SOQL. Se pensi che sia piuttosto algoritmico e affidabile, quella potrebbe essere la strada da percorrere.