だから、私はこの新しいプロジェクトを持っています。私の会社では、SalesForce.com クラウドを使用して、日常業務に関する情報を保存しています。私の仕事は、とりわけ、このデータの CRUD 操作を既存の社内アプリケーション機能とよりシームレスに統合する新しいアプリケーションを作成することです。
Salesforce WSDL API の中心は、クエリ コマンドを文字列として受け取る一連の「query()」Web メソッドです。クエリの構文は SQL っぽいですが、完全ではありません (彼らはそれを SOQL と呼んでいます)。私は「魔法の文字列」が好きではないので、コードベースで Linq を使用し、サービスのラッパーで必要な SOQL クエリに IQueryable を解析したいと考えています。それは確かに可能です (L2E、L2Sql)、しかし近道があるかどうか知りたいです。別の方法 (古いアプリで使用されていた一般的なクエリごとの方法である可能性が最も高い)。汎用の SOQL パーサーの作成に成功すれば、今後のいくつかのアプリでそれを使用できるようになり、私はヒーローになります。
私が見ているオプションは次のとおりです。
- 既存の Linq2SOQL プロバイダーをもっと探してください (私の Google-fu はここで私を失敗させています。そうでなければ、単に 1 つもありません。唯一の .NET ラッパーは、あると便利なものとして Linq について言及しているだけです)。
- 式ツリー パーサーを構築します。少なくとも Select メソッドと Where メソッドの呼び出しをサポートする必要があり、ラムダを解析するか、メソッド本体を操作して、必要な操作とプロジェクションを取得する必要があります。これはかなり大規模な作業のように思えますが、私が言ったように、それは確かに可能です。
- Linq2Sql または同様の既存の Linq プロバイダーでサービスをラップします。これにより、十分に近いクエリ文字列を抽出し、洗練してサービスに渡すことができます。そこには何十人もいるに違いありません(立ち寄っただけの人はいませんが、知る限り)。
- Expression.ToString() (または Expression.DebugView) を呼び出し、その文字列を操作して SOQL クエリを作成します。それはもろく、(舞台裏で)醜く、私が明示的に探しているものだけをサポートしますが、先に進むことができる基本的な翻訳を提供します.
皆さんはどう思いますか?Linq パーサーの作成は、1 人の人間にとって 2 日以上の作業でしょうか? 既存の Linq プロバイダーが関与する行き詰まりのソリューションは、おそらくそれを行うでしょうか? 式の文字列を切り刻んで、そのようにクエリを作成するのはひどいことでしょうか?
編集:接地のためのカークに感謝します。基本的な SOQL パーサーでさえ、何をする必要があるかをさらに調べましたが、実行可能なスケジュールでアプリケーション コードを作成することは、私の範囲を超えています。たとえば、Select() メソッドのラムダから選択リストを作成するか、WSDL オブジェクトのすべての既知の列から選択リストを作成する必要があります。 . これをかなり大きな問題に変える可能性のある他の多くの「未知の未知」があると確信しています. Linq プロバイダーの作成の基本を示すいくつかのリンクを見つけました。それらはすべて単純化しようとしていますが、現時点では時間的に実現可能ではありません。今のところ、リポジトリを構築します。名前付きクエリをカプセル化する名前付きメソッドを使用します (書式設定可能なクエリ文字列の定数クラスは、メンテナンスで頭を悩ませる量を減らす必要があります)。完全ではありませんが、はるかに実現可能です。Linq2SOQL プロバイダーが社内またはオープンソースで軌道に乗った場合、リファクタリングできます。
Linq プロバイダーのリファレンスを探している他の人のために、私が見つけた役立つリンクを次に示します。
- Linq プロバイダーの構築
- チュートリアル: IQueryable LINQ プロバイダーの作成
- Linq: IQueryable プロバイダー シリーズの構築 - 17 部構成! <-- これは、長くて複雑ですが、本当に詳細な説明がたくさんあり、「初めての人」に適しています。