CAML Query on SharePoint Online View

Mám velmi velkou knihovnu v prostředí SharePoint Online:> 3000 (sady dokumentů) v kořenové složce a více než 7000 (sady dokumentů, složky a dokumenty) celkem. Systém je založen hlavně na vlastním kódu: C # CSOM.

Pokud jde o výkon, systému by velmi prospělo dotazování na podmnožiny celého souboru dat, spíše na celých 7 000 položek pokaždé (moje současné řešení načte dávky 5 000 položek do ListItemCollection: v mém případě nejprve 5000 a poté 2000 a poté dotazování provádí LINQ), zejména s ohledem na to, že určité operace jsou přímo svázány s konkrétními pohledy.

Snažím se implementaci níže, jak je uvedeno v komentáři k jinému vláknu .

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

Mým problémem je, že ListItemCollection je naplněn všemi položkami v kořenové kolekci (3000), když vybrané pokusené pohledy obsahují maximálně 60 položek.

View.ViewQuery je naplněn touto hodnotou:

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

Má výše uvedený kód fungovat? Pokud ano, co se děje? Pokud ne, jaké je další řešení, kterým se dosáhne stejné věci?

Komentáře

  • Jak vypadá ViewQuery líbí se mi?

Odpověď

Vytahujete CAML ze zobrazení, protože uživatelé mohou aktualizovat podrobnosti filtru? Pokud tomu tak není, je pravděpodobně lepší způsob, jak ručně vyplňovat dotaz.

Vyzkoušejte to:

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

Vzhledem k tomu, že váš seznam obsahuje> 7 tis. položek, musíte také zajistit, aby jedna nebo obě sloupců Stage a PastTransition jsou indexovány. Může záležet na tom, který z nich vrátí menší podmnožinu dat a v jakém pořadí jsou vyhodnocena.

Možná budete muset místo „Rekurzivní“ udělat „RecursiveAll“, podle toho, zda chcete / potřebujete vrátit složky. Zobrazit výčet rozsahu: https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spviewscope.aspx

Takto byste měli získat filtrovaný seznam. Odtamtud může váš kód provádět jakékoli seskupování / objednávání vrácených položek.

Aktualizace

Vzhledem k tomu, že podrobnosti dotazu je třeba dynamicky přenášet z existujících zobrazení (podle vaší zpětné vazby níže), můžete obsah existujícího zobrazení vytáhnout. do zobrazení XML výše. Tím se zbavíte a také povolíte spuštění dotazu na seznamech> 5k.

Úplné řešení najdete v kódu Jurgena.

Komentáře

  • Funguje to takto. Znamená to, že nastavení dotazu CAML a filtrování na indexovaných sloupcích s dotazovatelnou datovou sadou více než 5 000 položek, nepadne, pokud je vrácený výsledek menší než 5 000? Toto je řešení, ale ve skutečnosti ne řešení. Existuje způsob, jak je to z pohledu? Chtěl bych, aby byl dotaz dynamicky vytvořen z několika pohledů a nemusel pokaždé znovu vytvářet konfiguraci zobrazení v dotazu CAML, pokud je to samozřejmě možné. Toto je však velmi dobrý začátek! Takže díky hodně 🙂
  • @JurgenCuschieri: Mělo by to fungovat dobře, pokud existuje více než 5 tisíc položek seznamu. Nejsem si jistý, zda ' plně rozumím vašemu případu použití, ale pokud chcete dynamicky vytáhnout podrobnosti filtru ze zobrazení (nebo zobrazení), můžete to pravděpodobně provést roztržením < Query > část pohledu ' s CAML a jeho dynamické vstřikování do < Zobrazit Scrope = " Recusive " > < / Zobrazit >.
  • Zkusím to ' a vrátím se zpět k vám. Aby to bylo trochu jasnější, mám zavedený systém s mnoha různými dotazy. CAML dotaz se používá k načtení dávek 5 000 položek do kolekce položek seznamu. LINQ se používá k dotazování na výsledný ListItemCollection. Není nutné říkat, že operace trvá dlouho, než se vrátí výsledek. Každý (nebo téměř každý) scénář je teoreticky vázán na pohled. což znamená, že dotazovatelnou datovou sadu lze minimalizovat na stejné výsledky zobrazení. Pokud tedy lze caml dotaz automaticky naplnit z pohledu ' s dotazem automaticky – dává větší smysl, ne?
  • pohledy definují konkrétní etapy v rámci klientské společnosti ' obchodního procesu. ty operace CAML dotazu, které se používají konkrétně v rámci fáze, mohou proto použít stejný dotaz jako pohled. Tím se zpřesní dotazovatelná datová sada, místo aby se pokaždé používaly všechny položky v seznamu.
  • Skvělé! Jsem rád, že to vyšlo. Nás vývojáři SharePointu musí držet pohromadě … 🙂

odpověď

Níže je moje konečné řešení, na základě odpovědi @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(); 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *