SharePointOnlineビューでのCAMLクエリ

SharePointOnline環境に非常に大きなライブラリがあります。ルートフォルダーに3000(ドキュメントセット)以上、7000以上(ドキュメントセット、フォルダ、ドキュメント)合計。このシステムは、主にカスタムコードC#CSOMに基づいています。

パフォーマンスに関しては、システムは、毎回7000アイテム全体ではなく、データセット全体のサブセットでクエリを実行することで大きなメリットが得られます(現在のソリューションでは、5000アイテムのバッチをListItemCollectionにロードします。私の場合は最初に5000、次に2000、そしてクエリはLINQ)によって実行されます。特に、特定の操作が特定のビューに直接関連付けられていることを念頭に置いてください。

別のスレッドのコメントにある以下の実装を試しています。

Microsoft.SharePoint.Client.List list = ctx.Web.Lists.GetByTitle(ListName); ctx.Load(list); ctx.ExecuteQuery(); Microsoft.SharePoint.Client.View view = list.Views.GetByTitle(viewName); ctx.Load(view); ctx.ExecuteQuery(); CamlQuery query = new CamlQuery(); query.ViewXml = view.ViewQuery; ListItemCollection items = list.GetItems(query); ctx.Load(items); ctx.ExecuteQuery(); 

私の問題は、選択したビューが最大60個のアイテムで構成されている場合に、ListItemCollectionにルートコレクション(3000)のすべてのアイテムが入力されていることです。

view.ViewQueryには次の値が入力されます。

"<GroupBy Collapse=\"FALSE\" GroupLimit=\"30\"><FieldRef Name=\"CurrentStatus\" /></GroupBy><OrderBy><FieldRef Name=\"CurrentStatus\" Ascending=\"FALSE\" /><FieldRef Name=\"Stage\" /></OrderBy><Where><And><Eq><FieldRef Name=\"Stage\" /><Value Type=\"Text\">Confirm Container</Value></Eq><Eq><FieldRef Name=\"PastTransition\" /><Value Type=\"Boolean\">0</Value></Eq></And></Where>" 

上記のコードは機能するはずですか?はいの場合、何が間違っていますか?そうでない場合、同じことを実現する別のソリューションは何ですか?

コメント

  • ViewQueryはどのように見えますかのように?

回答

ユーザーがフィルターの詳細を更新する可能性があるため、ビューからCAMLをプルしていますか?そうでない場合は、クエリを手動でティーアップするのがおそらくより良い方法です。

これを試してみてください:

query.ViewXml ="<View Scope=\"Recursive\"><Query><Where><And><Eq><FieldRef Name=\"Stage\" /><Value Type=\"Text\">Confirm Container</Value></Eq><Eq><FieldRef Name=\"PastTransition\" /><Value Type=\"Boolean\">0</Value></Eq></And></Where></Query></View>" 

リストは7kを超えるアイテムであるため、一方または両方を確認する必要もあります。 Stage列とPastTransition列のインデックスが作成されます。どちらがデータの小さいサブセットを返すか、およびそれらが評価される順序に依存する場合があります。

フォルダを返すかどうかによっては、「Recursive」ではなく「RecursiveAll」を実行する必要がある場合もあります。スコープの列挙を表示する: https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spviewscope.aspx

これにより、フィルターされたリストが表示されます。そこから、コードは返されたアイテムに対して任意のグループ化/順序付けを行うことができます。

更新

クエリの詳細は既存のビューから動的に取得する必要があるため(以下のフィードバックに従って)、既存のview.ViewQueryからコンテンツをプルして挿入できます。上記のビューXMLに。これにより、5kを超えるリストでクエリを実行できるようになります。

完全に焼き付けられたソリューションについては、Jurgenのコードを参照してください。

コメント

  • このように機能します。 CAMLクエリを設定し、5000アイテムを超えるクエリ可能なデータセットを含むインデックス付き列でフィルタリングしても、返される結果が5000未満の場合でもクラッシュしませんか?これは回避策ですが、実際には解決策ではありません。取得する方法はありません。ビューからクエリを作成しますか?もちろん、可能であれば、CAMLクエリでビュー構成を毎回再作成する必要はありません。これはすでに非常に良いスタートです。ありがとうございます。たくさん:)
  • @JurgenCuschieri:5Kを超えるリストアイテムがある場合は正常に機能するはずです。'のユースケースを完全に理解しているかどうかはわかりませんが、 1つまたは複数のビューからフィルターの詳細を動的に引き出したい場合は、<クエリ>ビューの一部'のCAMLと、それを<ビューScrope = " Recusive > < / View >。
  • 'それを試して、元に戻します。少し明確にするために、さまざまなクエリを備えたシステムを用意しています。 CAMLクエリは、5000アイテムのバッチをリストアイテムコレクションにロードするために使用されます。 LINQは、結果のListItemCollectionをクエリするために使用されます。言うまでもなく、操作が結果を返すまでに長い時間がかかります。すべての(またはほぼすべての)シナリオは、理論的にはビューに関連付けられています。つまり、クエリ可能なデータセットを最小化して同じビュー結果にすることができます。したがって、camlクエリをビューから自動的に入力できる場合'クエリは自動的に入力されます-より理にかなっていますか?
  • ビューはクライアント企業内の特定のステージを定義します'のビジネスプロセス。したがって、ステージ内で特に使用されるCAMLクエリ操作は、ビューと同じクエリを使用できます。これにより、リスト内のすべてのアイテムを毎回使用するのではなく、クエリ可能なデータセットが改良されます
  • すばらしい!それがうまくいったことをうれしく思います。私たちSharePoint開発者は固執する必要があります… 🙂

回答

以下は私の最終的な解決策です、 @JimBarntishの回答に基づいています。

Microsoft.SharePoint.Client.List list = ctx.Web.Lists.GetByTitle(ListName); ctx.Load(list); ctx.ExecuteQuery(); Microsoft.SharePoint.Client.View view = list.Views.GetByTitle(viewName); ctx.Load(view); ctx.ExecuteQuery(); CamlQuery query = new CamlQuery(); query.ViewXml = view.ViewQuery; int pFrom = query.ViewXml.IndexOf("<Where>") + "<Where>".Length; int pTo = query.ViewXml.LastIndexOf("</Where>"); string whereClause = query.ViewXml.Substring(pFrom, pTo - pFrom); string queryStr = "<View Scope=\"Recursive\"><Query><Where>" + whereClause + "</Where></Query></View>"; query.ViewXml = queryStr; ListItemCollection items = list.GetItems(query); ctx.Load(items); ctx.ExecuteQuery(); 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です