質問

だから、私はこの新しいプロジェクトを持っています。私の会社はSalesforce.comクラウドを使用して、日々の運用に関する情報を保存しています。私の仕事は、とりわけ、このデータのCRUD操作を既存の社内アプリケーション機能とよりシームレスに統合する新しいアプリケーションを作成することです。

Salesforce WSDL APIの中心は、Queryコマンドを文字列として取得する「Query()」Webメソッドのセットです。クエリの構文はSQL-ishですが、完全ではありません(SOQLと呼ばれます)。私は「マジックストリングス」のファンではないので、コードベースでLINQを使用し、サービスに必要なSOQLクエリにIQUERYABLEを解析したいと思います。確かに可能です(L2E、L2SQL)が、ショートカットがあるかどうかを知りたいです。別の方法(おそらく、一般的な使用クエリごとのメソッドであり、これは古いアプリで使用される方法でした)。汎用SOQLパーサーを作成することに成功した場合、他のいくつかのアプリで使用できます。ヒーローになります。特定のクエリ構造のみをサポートするシンプルなものを作成したとしても、現在のプロジェクトをlinq-yの方法で進めることができるようにすることで、大いに役立ち、自由な時期に拡張することができます。

ここに私が見ているようなオプションがあります:

  • 既存のlinq2SOQLプロバイダーを探してください(私のGoogle-Fuはここで私に失敗しています。そうでなければ、単に1つではありません。唯一の.NETラッパーは、LinqをNICE-TO-HAVEとしてだけ言及しています)。
  • 式ツリーパーサーを構築します。少なくとも、メソッドが呼び出す場所と場所をサポートする必要があり、必要な操作とプロジェクションを取得するために、ラムダを解析するか、メソッド本体を操作する必要があります。これはかなり大きな作業のようですが、私が言ったように、それは確かに可能です。
  • サービスをLINQ2SQLまたは既存の既存のLINQプロバイダーで包みます。このプロバイダーでは、クエリ文字列を抽出し、磨き上げてサービスに渡すことができます。そこには数十がいるに違いありません(ただし、ちょうど立ち寄るだけではありませんが)。
  • expression.toString(それは脆く、醜い(舞台裏で)、私が明示的に探しているものだけをサポートしますが、それは私が先に進むことを可能にする初歩的な翻訳を提供します。

皆さんはどう思いますか? Linqパーサーを構築すると、1人の男の2日間以上のタスクがありますか?既存のLINQプロバイダーが関与する本格化されたソリューションは、おそらくそれを行うでしょうか? Expression Stringを切り刻み、そのように私のクエリを作成するのはひどいでしょうか?

編集: 接地してくれたカークに感謝します。基本的なSOQLパーサーでさえも必要なことをさらに検討しましたが、実行可能なスケジュールで作業アプリケーションコードを作成する範囲を超えています。たとえば、select()メソッドLambdaまたはWSDLオブジェクトのすべての既知の列からのデフォルトのリストのいずれかからSELECTリストを作成する必要があります。 。これをかなり大したことに変えることができる他の多くの「未知の未知」があると確信しています。 LINQプロバイダーを書くことの基本を示すいくつかのリンクを見つけましたが、それらはすべてそれをシンプルにしようとしていますが、今は時間的には実行可能ではありません。今のところ、リポジトリを構成します。名前の付いたクエリをカプセル化する名前のメソッドを使用します(フォーマット可能なクエリ文字列の一定のクラスは、メンテナンスのヘッドスクラッチの量を減らす必要があります)。完璧ではありませんが、はるかに実行可能です。 LINQ2SOQLプロバイダーが社内またはオープンソースのいずれかで地面から降りると、リファクタリングできます。

LINQプロバイダーの参照を探している他の人のために、ここに私が見つけた役立つリンクがあります:

役に立ちましたか?

解決

一度にそれらを1つ持ってみましょう:

既存のlinq2SOQLプロバイダーを探してください(私のGoogle-Fuはここで私に失敗しています。そうでなければ、単に1つではありません。唯一の.NETラッパーは、LinqをNICE-TO-HAVEとしてだけ言及しています)。

ええ、私はすでに存在しているとは思わないが、うまくいけばあなたはそれを見つけることができる。

式ツリーパーサーを構築します。少なくとも、メソッドが呼び出す場所と場所をサポートする必要があり、必要な操作とプロジェクションを取得するために、ラムダを解析するか、メソッド本体を操作する必要があります。これはかなり大きな作業のようですが、私が言ったように、それは確かに可能です。

これは、長期にわたってこれについて本当に真剣である場合、絶対に行く方法です。

サービスをLINQ2SQLまたは既存の既存のLINQプロバイダーで包みます。このプロバイダーでは、クエリ文字列を抽出し、磨き上げてサービスに渡すことができます。そこには数十がいるに違いありません(ただし、ちょうど立ち寄るだけではありませんが)。

「ドロップイン」とはどういう意味ですか? L2からSQLを簡単に直接入手できます。

expression.toString(それは脆く、醜い(舞台裏で)、私が明示的に探しているものだけをサポートしますが、それは私が先に進むことを可能にする初歩的な翻訳を提供します。

私はこのアプローチからあなたを強く落胆させます。 少なくとも 表現ツリーを適切に解析するのと同じくらい難しい。どちらかといえば、これを使用するには、最初に解析された文字列を適切なオブジェクトモデルに入れる必要があります。


本当に、クエリプロバイダーを構築し、これを正しく行うことを検討する必要があります。プリミティブな意味でさえ動作するものを得るためには、2日間は少しストレッチだと思いますが、それは可能かもしれません。 IMO、あなたはそれを家でいくつか調査し、それをおもちゃにしてください。そうすれば、基本的な部分と部分に精通しています。そうすれば、2日後に使用可能なクエリをいくつか取得できない場合があります。

正直なところ、この種のプロジェクトを完全に実装することは、数ヶ月ではないにしても、数週間ではなく数週間の領域にあります。

それがあまりにも多くの作業である場合は、オプション3を考慮するかもしれません。私はSOQLの専門家ではないので、通常のSQLクエリをSOQLクエリに変換する作業がどのような作業が必要かわかりません。むしろアルゴリズムで信頼できると思うなら、それが道になるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top