CAMLでは、「含む」要素を使用してSharePointリストアイテムをクエリできますが、使用できる「含まない」要素はありません。
では、文字列を含まないアイテムを取得するための最良の方法は何ですか?すべてのアイテムをループするよりも良い方法はありますか?
CAMLでは、「含む」要素を使用してSharePointリストアイテムをクエリできますが、使用できる「含まない」要素はありません。
では、文字列を含まないアイテムを取得するための最良の方法は何ですか?すべてのアイテムをループするよりも良い方法はありますか?
同じ制限が BeginWith にも適用されます。悲しいことに、良い解決策はわかりません。あなたができること:Contains-Queryを実行し、各アイテムをループしてIDを取得してから、「ID NotEqual 1またはID NotEqual 2またはID NotEqual 3 ...」に対して別の大きなクエリを実行しますIDは次のようにインデックス付けされているため私の知る限り、データベースへの影響は小さいはずですが、それでも非常に悪臭がします。
小さなリストの場合は問題ありません。大きなリストの場合は、SQL Server プロファイラーを使用して影響を確認します。
では、文字列を含まないアイテムを取得するための最良の方法は何ですか?
計算列を使用して、反対の値を作成することにより、探している値を反映してみてください。
たとえば、列の名前がIsCriticalであるとします。次に、列を「YES / NO」として追加し、数式を次のように追加します
=ISNUMBER(FIND("Critical"), [Title])
次に、CAMLクエリで
<Query>
<Where>
<Eq>
<FieldRef Name='IsCritical'/>
<Value Type='Boolean'>0</Value>
</Eq>
</Where>
</Query>
このクエリの0は、「重要ではない」ことを反映しています。ただし、残念ながら存在しないネイティブCAML「NotContaints」を使用するのとは対照的に、パフォーマンスがどうなるかはわかりません。
MSDNのCAMLクエリスキーマも参照してください。
この「Contains」と「BeginsWith」の問題も気になります。Sharepoint の次のバージョンでは、caml が拡張されて、ただの足の障害ではなく、実際のツールになることを願っています。
私が行う方法は、クエリを可能な限り指定してから、C# コードの条件に一致しない行をフィルター処理することです。条件に一致する1つの結果で終了するために100行を処理する必要がある場合があるため、非常に醜い場合があります。
含まれていません
<NotIncludes>
<FieldRef Name='FileLeafRef' />
<Value Type='Text'>stringvalue</Value>
</NotIncludes>
@drax: CAML がなくなることを願いましょう - ピリオド。これは間違いなく、現在の SP プログラミングの最悪の側面の 1 つです。