Camlex 3.2:CAMLのリバースエンジニアリングとラムダ式を使用したSharepointの文字列クエリへの条件の追加

少し前に、オープンソースのCamlex.Netプロジェクトの次のリリースがリリースされました 。 非常に興味深い機能がバージョン3.2に追加されました。これについては、この記事で説明します。



最初に、Camlexが何であるか、そしてそれが開発でどのように役立つかについてのいくつかの言葉。 Sharepointを使用している場合、CAMLリクエストを作成する必要性が発生している可能性があります。 CAML(Collaborative Application Markup Language)は、Sharepointでさまざまな目的に使用される特別な言語です。 その用途の1つは、シートやドキュメントライブラリからデータを取得するためのSqlのようなクエリを作成することです。 たとえば、リストからすべてのアイテムを選択するには、値が「Meeting」であるTitleフィールドと、Description-「Sharepoint」で、次のクエリを使用する必要があります。

<Where> <And> <Eq> <FieldRef Name="Title" /> <Value Type="Text">Meeting</Value> </Eq> <Eq> <FieldRef Name="Description" /> <Value Type="Text">Sharepoint</Value> </Eq> </And> </Where>
      
      







リクエストにさらに条件を追加する必要がある場合は、Xmlツリー全体を再構築する必要があります(CAMLでは、AndおよびOr要素は2つのオペランドのみを持つことができます)。 さらに、文字列を操作する場合、コンパイラーは役に立ちません。コンパイル段階でエラーをキャッチします。



Camlexでは、C#のラムダ式を使用してこのクエリを記述できます。

 string query = Camlex.Query() .Where(x => (string)x["Title"] == "Meeting" && (string)x["Description"] == "Sharepoint").ToString();
      
      





さらに、Camlexにはアプリケーション開発者にとって多くの便利な機能があります。 詳細については、プロジェクトの最初のバージョン(私と私はウラジミールティマシュコフ )をリリースした約2年前に公開されたHabréの別の記事をご覧ください。 Camlex.Netとタグ付けされた私のブログ記事: http ://sadomovalex.blogspot.fi/search/label/Camlex.NET



今すぐ投稿のトピックに直接。 約6か月前、プロジェクトに非常に重要な機能であるCAMLリバースエンジニアリングを追加しました。 文字列クエリを解析し、それらに基づいて式ツリーを作成できます。 リバースエンジニアリングを使用して、無料のオンラインサービスhttp://camlex-online.orgを開始しました。これにより、CAML文字列リクエストをC#コードに変換できます。 つまり Camlexは逆の結果を出しました。 詳細が興味深い場合、式ツリーからのC#コード生成は、別のオープンソースプロジェクトExpressionToCodeを使用して行われました(ただし、少しはドップされています)。



最近、いくつかのリクエストを受け取りました。開発者は、既存のCAMLリクエストに条件を追加できるかどうか尋ねましたか? リバースエンジニアリングが既に行われていることを考えると、このタスクは私にとって興味深いものでした。 バージョン3.2では、この機能が追加されました。 これで、Camlexを通常の文字列クエリで動作するツールと一緒に使用し、Camlexで拡張して、結果を文字列として返すことができます。



例を見てみましょう。 次のクエリがあると想像してください。

 <Where> <Eq> <FieldRef Name="Title" /> <Value Type="Text">Sharepoint</Value> </Eq> </Where>
      
      





彼は「Sharepoint」というタイトルのアイテムを返します。 「Office」というタイトルのアイテムも取得するために、リクエストに別の条件を追加する必要があるとします。 これで次のようにできます:

 string query = Camlex.Query().WhereAny(existingQuery, x => (string)x["Title"] == "Office").ToString();
      
      





つまり 文字列リクエストと新しい条件をラムダ式として渡すだけです。 結果は次のようになります。

 <Where> <Or> <Eq> <FieldRef Name="Title" /> <Value Type="Text">Sharepoint</Value> </Eq> <Eq> <FieldRef Name="Title" /> <Value Type="Text">Office</Value> </Eq> </Or> </Where>
      
      





より複雑な文字列クエリに複数の条件を一度に追加することもできます。 IQueryインターフェイスが拡張されたメソッドのリストは次のとおりです。

 public interface IQuery { // ... IQuery WhereAll(string existingWhere, Expression<Func<SPListItem, bool>> expression); IQuery WhereAll(string existingWhere, IEnumerable<Expression<Func<SPListItem, bool>>> expressions); IQuery WhereAny(string existingWhere, Expression<Func<SPListItem, bool>> expression); IQuery WhereAny(string existingWhere, IEnumerable<Expression<Func<SPListItem, bool>>> expressions); IQuery OrderBy(string existingOrderBy, Expression<Func<SPListItem, object>> expr); IQuery OrderBy(string existingOrderBy, Expression<Func<SPListItem, object[]>> expr); IQuery OrderBy(string existingOrderBy, IEnumerable<Expression<Func<SPListItem, object>>> expressions); IQuery GroupBy(string existingGroupBy, Expression<Func<SPListItem, object>> expr); IQuery GroupBy(string existingGroupBy, Expression<Func<SPListItem, object[]>> expr); }
      
      





つまり クエリ条件(WhereAllおよびWhereAny)だけでなく、OrderByおよびGroupByも展開できます。 ViewFieldsを拡張することもできますが、これらのメソッドは別のインターフェースにあります。 クエリを構築する際の全体的なコールチェーンの一部ではありません。



より複雑な例を考えてみましょう。 上記の2つの条件を一度に受け取った文字列クエリに追加します。参加者の数が1より多く、ステータスが空でない要素も選択します。

 string existingQuery = "<Where>" + " <And>" + " <Eq>" + " <FieldRef Name=\"Title\" />" + " <Value Type=\"Text\">Sharepoint</Value>" + " </Eq>" + " <Eq>" + " <FieldRef Name=\"Title\" />" + " <Value Type=\"Text\">Office</Value>" + " </Eq>" + " </And>" + "</Where>"; var query = Camlex.Query().WhereAny(existingQuery, x => (int)x["Participants"] > 1 && x["Status"] != null).ToString();
      
      





その結果、以下が得られます。

 <Where> <Or> <And> <Gt> <FieldRef Name="Participants" /> <Value Type="Integer">1</Value> </Gt> <IsNotNull> <FieldRef Name="Status" /> </IsNotNull> </And> <And> <Eq> <FieldRef Name="Title" /> <Value Type="Text">Sharepoint</Value> </Eq> <Eq> <FieldRef Name="Title" /> <Value Type="Text">Office</Value> </Eq> </And> </Or> </Where>
      
      





つまり Camlexは、それ自体のかなり複雑なCAML要求の形成に関するすべての作業を引き受けます。



結論として、Camlexはコミュニティのニーズから発展したプロジェクトであると言いたいと思います。 新しい機能を追加するためのアイデアや提案がある場合は、プロジェクトのWebサイトの「 ディスカッション」セクションでそれらを作成してください。 すべての質問に答え、可能な限り新しい機能を追加しようとします。



All Articles