ユーザーが変更または追加したすべてのドキュメントを選択するために caml クエリを使用しています。クエリは、指定されたサイト コレクションのすべてのサブサイトで再帰的に実行されます。
ここでの問題は、結果セットの一部でもあるフォルダーを削除できないことです。今のところ、結果データテーブルからそれらをフィルタリングしています。しかし、私は疑問に思っています: caml を使用するだけで、結果セットからフォルダーを除外することは可能ですか?
ユーザーが変更または追加したすべてのドキュメントを選択するために caml クエリを使用しています。クエリは、指定されたサイト コレクションのすべてのサブサイトで再帰的に実行されます。
ここでの問題は、結果セットの一部でもあるフォルダーを削除できないことです。今のところ、結果データテーブルからそれらをフィルタリングしています。しかし、私は疑問に思っています: caml を使用するだけで、結果セットからフォルダーを除外することは可能ですか?
このCAMLは実際にトリックを行います:
<Where>
<Eq>
<FieldRef Name='FSObjType' />
<Value Type='Integer'>0</Value>
</Eq>
</Where>
それはあなたにどんなフォルダも与えません。
だから、私はそれを理解しました:) CamlクエリでFieldRef = 'ContentType'を使用して、選択または選択から除外するコンテンツタイプのtyprを指定できます。
したがって、私の場合、この条件を caml 式に追加しました。
<Neq><FieldRef Name='ContentType' /><Value Type='Text'>Folder</Value></Neq>
注: 多言語設定には問題があります。コンテンツ タイプの名前は異なる場合があるため、リソースからコンテンツ タイプの名前を取得することをお勧めします。
アップデート:
どうやら私の推測は早すぎたようです。私たちのプロジェクトではそのようなコンテンツタイプが使用されているため、フォルダーのコンテンツタイプに基づいてすべてのコンテンツタイプを除外する必要があります:(
caml で実行可能なクエリを作成できなかったので、リスト アイテムの ContentTypeId を選択するビュー フィールド要素をクエリに追加し、フォルダのコンテンツ タイプに基づいて行を除外しました。
これを行うコードは些細なことですが、純粋な caml ではこのような単純なタスクを実行できないことが気になります。
フォルダを操作していて、SPQueryオブジェクトを使用している場合は、ViewAttributesフィールドを使用して、アイテムを再帰的に取得できるようにすることもできます。値をScope="Recursive"に設定すると、サブフォルダーからアイテムが取得され、結果セット内のフォルダーオブジェクトは取得されません。
myQuery.ViewAttributes = "Scope=\"Recursive\"";
Dave T.の答えは私にはうまくいきませんでしたが、それをインスピレーションとして、私が思いついたのは次のとおりです。
<Where>
<BeginsWith><FieldRef Name="ContentTypeId" />
<Value Type="ContentTypeId">0x0101</Value>
</BeginsWith>
</Where>
主な問題は、コンテンツ タイプがリスト/ライブラリに追加されるとリスト コンテンツ タイプになり、その ID に別の GUID (0x010100...)が追加されるため、サイト レベルでしか ContentTypeId を知ることができないことです。また 、CAML には NotBeginsWith条件がないため、フォルダーを除外することはできませんが、サイト コンテンツ タイプ ID が0x0101であるドキュメントのみを含めることができます。
FSObjTypeフィールドを使用したソリューションは、しきい値よりもはるかに多くのファイルを含むライブラリがあり、クエリ内のすべてのフィールドにインデックスを付ける必要があり、このフィールドにインデックスを付ける方法が見つからないため、うまくいきません。
これは私のために働いたものです
<Where>
<Eq>
<FieldRef Name='FSObjType' />
<Value Type='Number'>1</Value>
</Eq>
</Where>
結果セットにフォルダを含む他の回答のCAMLクエリを確認してください
演算子を変更するだけで、必要なものが得られる場合があります
<Where>
<NotIncludes>
<FieldRef Name='ContentTypeId' />
<Value Type='ContentTypeId'>0x0120</Value>
</NotIncludes>
</Where>
それがうまくいくかどうかはわかりません。
私にとっても、以下のように機能しました:-
<Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq></Where>