Fournisseur "SQL" de Linq to Salesforce

c# expression-trees linq salesforce soql

Question

Donc, j'ai ce nouveau projet. Ma société utilise le cloud SalesForce.com pour stocker des informations sur les opérations quotidiennes. Mon travail consiste à rédiger une nouvelle application qui, entre autres, intégrera de manière plus transparente les opérations CRUD de ces données avec la fonctionnalité d'application interne existante.

Le cœur de l'API WSDL Salesforce est constitué d'un ensemble de méthodes Web "query ()" qui prennent la commande de requête sous forme de chaîne. La syntaxe de la requête est SQL-ish, mais pas tout à fait (ils l'appellent SOQL). Je ne suis pas un fan des "chaînes magiques", j'aimerais donc utiliser Linq dans la base de code et analyser IQueryable dans la requête SOQL dont j'ai besoin dans le wrapper du service. C'est certainement possible (L2E, L2Sql), mais j'aimerais savoir s'il y a un raccourci, car si je dis que cela prendra plus d'un jour ou deux pour me lancer, je serai "encouragé" à trouver une autre méthode (probablement une méthode pour chaque requête à usage général, qui était la méthode utilisée dans les anciennes applications). Si je réussis à créer un analyseur syntaxique SOQL à usage général, nous pourrons l'utiliser dans plusieurs autres applications à venir, et je serai un héros. Même si je fabrique un modèle simple ne prenant en charge que certaines structures de requête, cela me permettra de poursuivre le projet en cours avec Linq-y, et je pourrai le développer pendant mon temps libre.

Voici les options que je vois:

  • Recherchez un fournisseur Linq2SOQL existant (mon Google-fu me fait défaut, sinon il n’en existe tout simplement pas; le seul wrapper .NET mentionne uniquement Linq comme un outil agréable à utiliser).
  • Construire un analyseur d'arbre d'expression. Il doit au moins prendre en charge les appels de méthodes Select et Where, et doit analyser lambdas ou manipuler le corps de leurs méthodes pour obtenir les opérations et les projections nécessaires. Cela semble être une tâche plutôt lourde, mais comme je l'ai dit, c'est certainement possible.
  • Enveloppez le service dans Linq2Sql ou un fournisseur Linq existant similaire qui me permettra d’extraire une chaîne de requête suffisamment proche, de la polir et de la transmettre au service. Il doit y avoir des douzaines de personnes (mais aucune ne vient juste de tomber, autant que je sache).
  • Appelez Expression.ToString () (ou Expression.DebugView) et manipulez cette chaîne pour créer la requête SOQL. Ce sera fragile, ce sera moche (dans les coulisses), et cela ne supportera que ce que je cherche explicitement, mais cela fournira une traduction rudimentaire qui me permettra d'avancer.

Qu'en pensez-vous? La construction d'un analyseur syntaxique Linq représente-t-elle plus qu'une tâche de deux jours pour un gars? Une solution complexe impliquant un fournisseur Linq existant pourrait-elle le faire? Serait-il terrible de couper la chaîne d'expression et de construire ma requête de cette façon?

EDIT: Merci à Kirk pour la mise à la terre. J'ai jeté un œil de plus sur ce que je serais obligé de faire même pour un analyseur syntaxique SOQL de base, et il est tout simplement impossible d'obtenir du code d'application fonctionnel écrit selon un calendrier réalisable. Par exemple, je dois créer une liste de sélection à partir de la méthode Select () lambda ou d'une liste par défaut de toutes les colonnes connues de mon objet WSDL, tâche à laquelle je n'avais même pas pensé (je me concentrais davantage sur l'analyse Where). . Je suis sûr qu'il y a beaucoup d'autres "inconnus inconnus" qui pourraient transformer cela en une grosse affaire. J'ai trouvé plusieurs liens qui montrent les bases de la rédaction d'un fournisseur Linq. Bien qu'ils essaient tous de simplifier les choses, cela ne sera tout simplement pas réalisable dans le temps. Pour le moment, je structurerai mon référentiel à l'aide de méthodes nommées encapsulant des requêtes nommées (une classe constante de chaînes de requête formatables devrait réduire le nombre de casse-tête dans la maintenance). Pas parfait, mais beaucoup plus réalisable. Si et quand un fournisseur Linq2SOQL décolle, en interne ou en open source, nous pouvons le refactoriser.

Pour les autres personnes à la recherche de références à des fournisseurs Linq, voici les liens utiles que j'ai trouvés:

Réponse acceptée

Prenons-les un à la fois:

Recherchez un fournisseur Linq2SOQL existant (mon Google-fu me fait défaut, sinon il n’en existe tout simplement pas; le seul wrapper .NET mentionne uniquement Linq comme un outil agréable à utiliser).

Oui, je doute qu'il en existe déjà un, mais j'espère que vous en trouverez un.

Construire un analyseur d'arbre d'expression. Il doit au moins prendre en charge les appels de méthodes Select et Where, et doit analyser lambdas ou manipuler le corps de leurs méthodes pour obtenir les opérations et les projections nécessaires. Cela semble être une tâche plutôt lourde, mais comme je l'ai dit, c'est certainement possible.

C'est absolument la voie à suivre si vous êtes vraiment sérieux à ce sujet à long terme.

Enveloppez le service dans Linq2Sql ou un fournisseur Linq existant similaire qui me permettra d’extraire une chaîne de requête suffisamment proche, de la polir et de la transmettre au service. Il doit y avoir des douzaines de personnes (mais aucune ne vient juste de tomber, autant que je sache).

Qu'entendez-vous par "drop in"? Vous pouvez facilement obtenir le code SQL directement à partir de L2S.

Appelez Expression.ToString () (ou Expression.DebugView) et manipulez cette chaîne pour créer la requête SOQL. Ce sera fragile, ce sera moche (dans les coulisses), et cela ne supportera que ce que je cherche explicitement, mais cela fournira une traduction rudimentaire qui me permettra d'avancer.

Je vous déconseillerais fortement de cette approche, car au minimum, ce sera au moins aussi difficile que d'analyser correctement les arbres d'expression. Si vous voulez utiliser cela, vous devez d'abord placer les chaînes analysées dans un modèle d'objet approprié, c'est-à-dire les arbres d'expression existants avec lesquels vous commencez.


Vraiment, vous devriez penser à créer un fournisseur de requêtes et à le faire correctement. Je pense que deux jours est un peu exagéré pour obtenir quelque chose de fonctionner même dans un sens primitif, bien que cela puisse être possible. OMI, vous devriez faire des recherches à la maison et jouer avec pour vous familiariser avec les éléments de base. Vous pourrez alors à peine obtenir des requêtes utilisables après deux jours.

Honnêtement cependant, la mise en œuvre complète de ce type de projet s’applique en réalité à plusieurs semaines, voire des mois, pas des jours.

Si cela vous demande trop de travail, vous pouvez envisager l'option 3. Je ne suis pas un expert en SOQL, je ne sais donc pas quel type de travail impliquerait la transformation de requêtes SQL ordinaires en requêtes SOQL. Si vous pensez que c'est plutôt algorithmique et fiable, c'est peut-être la voie à suivre.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi