Interogare CAML pe SharePoint Online View

Am o bibliotecă foarte mare într-un mediu SharePoint Online:> 3000 (seturi de documente) în folderul rădăcină și mai mult de 7000 (seturi de documente, dosare și documente) în total. Sistemul se bazează în principal pe cod personalizat: C # CSOM.

În ceea ce privește performanța, sistemul ar beneficia foarte mult de interogarea subseturilor întregului set de date, mai degrabă asupra întregului 7000 de elemente de fiecare dată (soluția mea actuală încarcă loturi de 5000 de articole într-o ListItemCollection: în cazul meu mai întâi 5000 și apoi 2000, iar apoi interogarea se face de către LINQ) mai ales ținând cont de faptul că anumite operațiuni sunt direct legate de vizualizări specifice.

Încerc implementarea de mai jos așa cum se găsește într-un comentariu la un alt fir .

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(); 

Problema mea este că ListItemCollection este populat cu toate elementele din colecția rădăcină (3000), când vizualizările alese au încercat constând din cel mult 60 de articole.

View.ViewQuery este completat cu această valoare:

"<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>" 

Codul de mai sus ar trebui să funcționeze? Dacă da, ce este greșit? Dacă nu, care este o altă soluție care realizează același lucru?

Comentarii

  • Ce arată ViewQuery cum ar fi?

Răspuns

Trageți CAML din vizualizare, deoarece utilizatorii ar putea actualiza detaliile filtrului? Dacă nu, verificarea manuală a interogării este probabil cea mai bună cale de urmat.

Încercați acest lucru:

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>" 

Deoarece lista dvs. conține> 7k articole, va trebui să vă asigurați că unul sau ambele din coloanele Stage și PastTransition sunt indexate. Ar putea depinde de care se returnează cel mai mic subset de date și în ce ordine sunt evaluate.

Este posibil să fie necesar să faceți „RecursiveAll” în loc de „Recursive”, în funcție de dacă doriți / trebuie să returnați folderele. Afișați enumerarea domeniului: https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spviewscope.aspx

Aceasta ar trebui să vă afișeze lista filtrată. De acolo, codul dvs. poate face orice grupare / comandă pentru articolele returnate.

Actualizați

Deoarece detaliile interogării trebuie să fie transmise dinamic din vizualizările existente (conform feedback-ului dvs. de mai jos), puteți extrage conținutul din vizualizarea existentă.ViewQuery și injectați-l în vizualizarea XML de mai sus. Acest lucru va scăpa și va permite, de asemenea, interogarea să ruleze pe liste> 5k.

Consultați codul lui Jurgen pentru o soluție complet coaptă.

Comentarii

  • Funcționează astfel. Înseamnă că configurarea unei interogări CAML și filtrarea pe coloane indexate cu un set de date interogabile de mai mult de 5000 de articole, nu se va bloca dacă rezultatul returnat este mai mic de 5000? Aceasta este o soluție, dar nu este de fapt o soluție. din vizualizare? Aș dori să am interogarea creată dinamic din mai multe vizualizări și să nu trebuie să recreez de fiecare dată configurația vizualizării în interogarea CAML, dacă este posibil, desigur. Totuși, acesta este deja un început foarte bun! Deci, mulțumesc o mulțime 🙂
  • @JurgenCuschieri: Ar trebui să funcționeze bine dacă există mai mult de 5K elemente de listă. Nu sunt sigur că ' înțeleg pe deplin cazul dvs. de utilizare, dar dacă doriți să extrageți dinamic detaliile filtrului din vizualizare (sau vizualizări), probabil că ați putea face asta extragând < interogarea > porțiunea de vizualizare ' s CAML și injectându-l dinamic în < View Scrope = " Recuziv " > < / View >.
  • ' voi încerca asta și revin la dvs. Pentru a fi un pic mai clar, am un sistem în loc cu o mulțime de interogări diferite. Interogarea CAML este utilizată pentru a încărca loturi de 5000 de articole într-o colecție de articole din listă. LINQ este utilizat pentru interogarea ListItemCollection rezultată. Inutil să spun că operațiunea durează mult până se returnează un rezultat. Fiecare (sau aproape fiecare) scenariu este teoretic legat de o viziune. ceea ce înseamnă că setul de date interogabile poate fi redus la minimum la aceleași rezultate de vizualizare. deci dacă interogarea caml poate fi completată automat din interogarea vizualizării ' în mod automat – are mai mult sens, nu?
  • vizualizările definesc anumite etape în cadrul unei companii client ' proces de afaceri. acele operații de interogare CAML care sunt utilizate în mod specific într-o etapă, pot folosi deci aceeași interogare ca vizualizarea. Aceasta va rafina setul de date interogabile, mai degrabă decât să utilizeze toate elementele din listă de fiecare dată
  • Excelent! Mă bucur că a funcționat. Utilizatorii de programe SharePoint trebuie să rămână împreună … 🙂

Răspuns

Mai jos este soluția mea finală, pe baza răspunsului lui @Jim Barntish.

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(); 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *