Linq an Salesforce "SQL" -Anbieter

c# expression-trees linq salesforce soql

Frage

Also, ich habe dieses neue Projekt. Meine Firma verwendet die SalesForce.com-Cloud zum Speichern von Informationen zum Tagesgeschäft. Meine Aufgabe ist es, eine neue Anwendung zu schreiben, die unter anderem die CRUD-Operationen dieser Daten nahtlos in die vorhandene hauseigene Anwendungsfunktionalität integriert.

Das Herz der Salesforce-WSDL-API besteht aus einer Reihe von "query ()" - Webmethoden, die den Abfragebefehl als Zeichenfolge verwenden. Die Syntax der Abfrage ist SQL-ish, aber nicht ganz (sie nennen es SOQL). Ich bin kein Fan von "magischen Zeichenfolgen", also möchte ich Linq in der Codebasis verwenden und das IQueryable in die SOQL-Abfrage parsen, die ich im Wrapper für den Dienst brauche. Es ist sicherlich möglich (L2E, L2Sql), aber ich würde gerne wissen, ob es eine Abkürzung gibt, denn wenn ich sage, dass es mehr als ein oder zwei Tage dauern wird, bis ich meine eigenen rollen kann, werde ich "ermutigt" zu finden eine andere Methode (wahrscheinlich eine Methode für jede allgemeine Abfrage, die in älteren Apps verwendet wurde). Wenn es mir gelingt, einen universellen SOQL-Parser zu erstellen, können wir ihn in mehreren anderen kommenden Apps verwenden und ich werde ein Held sein. Selbst wenn ich ein einfaches mache, das nur bestimmte Abfragestrukturen unterstützt, wird es einen langen Weg zurücklegen, indem ich das aktuelle Projekt auf eine Linq-y-Weise fortsetzen kann, und ich kann es in meiner Freizeit erweitern.

Hier sind die Optionen, wie ich es sehe:

  • Sehen Sie sich einen vorhandenen Linq2SOQL-Provider genauer an (Mein Google-Fu versagt hier, sonst gibt es einfach keinen; der einzige .NET-Wrapper erwähnt nur Linq als Nice-to-have).
  • Erstellen Sie einen Ausdrucksbaum-Parser. Es muss mindestens die Methodenaufrufe Select und Where unterstützen und muss entweder lambdas analysieren oder ihre Methodenkörper manipulieren, um die erforderlichen Operationen und Projektionen zu erhalten. Dies scheint eine ziemlich große Aufgabe zu sein, aber wie ich schon sagte, es ist sicherlich möglich.
  • Wickeln Sie den Dienst in Linq2Sql oder einen ähnlichen vorhandenen Linq-Anbieter, der es mir ermöglicht, eine Zeichenfolge für ausreichend nahe Abfrage zu extrahieren, es aufzupolieren und es an den Dienst zu übergeben. Es muss dutzende da draußen geben (aber keine, die reinkommen, AFAIK).
  • Rufen Sie Expression.ToString () (oder Expression.DebugView) auf und ändern Sie diese Zeichenfolge, um die SOQL-Abfrage zu erstellen. Es wird brüchig, es wird hässlich sein (hinter den Kulissen), und es wird nur das unterstützen, was ich explizit suche, aber es wird eine rudimentäre Übersetzung liefern, die es mir erlauben wird, weiterzugehen.

Was denkt ihr? Ist das Erstellen eines Linq-Parsers mehr als eine zweitägige Aufgabe für einen Typ? Könnte eine zusammengeschlossene Lösung, die einen bestehenden Linq-Anbieter betrifft, dies möglicherweise tun? Wäre es schrecklich, den Ausdrucksstring zu zerhacken und meine Anfrage so zu konstruieren?

EDIT: Danke an Kirk für die Erdung. Ich habe mir noch mehr angeschaut, was ich für einen einfachen SOQL-Parser tun müsste, und es geht einfach über den Rahmen hinaus, dass ich keinen funktionierenden Applikationscode bekomme, der nach irgendeinem realisierbaren Zeitplan geschrieben wurde. Zum Beispiel muss ich eine Auswahlliste entweder aus der Select () - Methode Lambda oder einer Standardliste aus allen bekannten Spalten meines WSDL-Objekts erstellen, eine Aufgabe, an die ich nicht gedacht hatte (ich konzentrierte mich mehr auf die Where-Analyse) . Ich bin mir sicher, dass es viele andere "unbekannte Unbekannte" gibt, die das zu einer ziemlich großen Sache machen könnten. Ich habe mehrere Links gefunden, die die Grundlagen des Schreibens eines Linq-Anbieters zeigen, und obwohl sie alle versuchen, es einfach zu machen, wird es momentan einfach nicht machbar sein. Ich werde jetzt mein Repository strukturieren, indem ich benannte Methoden benutze, die benannte Abfragen kapseln (eine konstante Klasse von formatfähigen Query-Strings sollte das Kopfkratzen in der Wartung reduzieren). Nicht perfekt, aber viel praktikabler. Wenn und wann ein Linq2SOQL-Anbieter entweder intern oder als Open-Source-Anbieter auf den Markt kommt, können wir ihn umgestalten.

Für andere, die nach Linq-Provider-Referenzen suchen, hier sind die hilfreichen Links, die ich gefunden habe:

Akzeptierte Antwort

Nehmen wir sie nacheinander:

Sehen Sie sich einen vorhandenen Linq2SOQL-Provider genauer an (Mein Google-Fu versagt hier, sonst gibt es einfach keinen; der einzige .NET-Wrapper erwähnt nur Linq als Nice-to-have).

Ja, ich bezweifle, dass es einen gibt, aber hoffentlich kannst du einen finden.

Erstellen Sie einen Ausdrucksbaum-Parser. Es muss mindestens die Methodenaufrufe Select und Where unterstützen und muss entweder lambdas analysieren oder ihre Methodenkörper manipulieren, um die erforderlichen Operationen und Projektionen zu erhalten. Dies scheint eine ziemlich große Aufgabe zu sein, aber wie ich schon sagte, es ist sicherlich möglich.

Dies ist absolut der Weg zu gehen, wenn Sie auf lange Sicht wirklich ernst damit sind.

Wickeln Sie den Dienst in Linq2Sql oder einen ähnlichen vorhandenen Linq-Anbieter, der es mir ermöglicht, eine Zeichenfolge für ausreichend nahe Abfrage zu extrahieren, es aufzupolieren und es an den Dienst zu übergeben. Es muss dutzende da draußen geben (aber keine, die reinkommen, AFAIK).

Was meinst du mit "reinfallen"? Sie können das SQL einfach direkt aus L2S beziehen.

Rufen Sie Expression.ToString () (oder Expression.DebugView) auf und ändern Sie diese Zeichenfolge, um die SOQL-Abfrage zu erstellen. Es wird brüchig, es wird hässlich sein (hinter den Kulissen), und es wird nur das unterstützen, was ich explizit suche, aber es wird eine rudimentäre Übersetzung liefern, die es mir erlauben wird, weiterzugehen.

Ich würde Sie von diesem Ansatz dringend abhalten, da es mindestens genauso schwierig sein wird, die Ausdrucksbäume richtig zu analysieren. Um dies zu verwenden, müssten Sie die analysierten Strings zunächst in ein geeignetes Objektmodell einfügen, dh in die vorhandenen Ausdrucksbäume, mit denen Sie beginnen.


Eigentlich sollten Sie darüber nachdenken, einen Abfrageanbieter zu erstellen und dieses richtig zu machen. Ich denke, dass zwei Tage ein bisschen eine Strecke sind, etwas sogar in einem primitiven Sinn zu arbeiten, obwohl es möglich sein könnte. IMO, du solltest es zu Hause erforschen und damit herumspielen, damit du etwas Vertrautheit mit den grundlegenden Teilen und Teilen hast. Dann könnten Sie kaum brauchbare Abfragen nach zwei Tagen bekommen.

Ehrlich gesagt, ist die vollständige Umsetzung dieser Art von Projekt wirklich im Bereich von mehreren Wochen, wenn nicht Monaten - nicht Tagen.

Wenn das zu viel Arbeit ist, sollten Sie Option 3 in Erwägung ziehen. Ich bin kein Experte für SOQL, also keine Ahnung, welche Art von Arbeit damit verbunden wäre, gewöhnliche SQL-Abfragen in SOQL-Abfragen umzuwandeln. Wenn Sie denken, dass es eher algorithmisch und zuverlässig ist, könnte das der richtige Weg sein.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow