CAML-spørring på SharePoint Online View

Jeg har et veldig stort bibliotek i et SharePoint Online-miljø:> 3000 (dokumentsett) i rotmappen og mer enn 7000 (dokumentsett, mapper og dokumenter) totalt. Systemet er hovedsakelig basert på tilpasset kode: C # CSOM.

Ytelsesmessig vil systemet ha stor nytte av å spørre på delmengder av hele datasettet, snarere på hele 7000 elementer hver gang (den nåværende løsningen min laster grupper på 5000 elementer i en ListItemCollection: i mitt tilfelle først 5000 og deretter 2000, og deretter blir spørring gjort av LINQ) spesielt med tanke på at visse operasjoner er direkte knyttet til bestemte visninger.

Jeg prøver implementeringen nedenfor som funnet i en kommentar til en annen tråd .

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

Problemet mitt er at ListItemCollection blir fylt med alle elementene i rotsamlingen (3000), når de valgte utsiktene består av maksimalt 60 elementer.

Visningen.ViewQuery er fylt med denne verdien:

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

Skal koden ovenfor fungere? Hvis ja, hva er galt? Hvis ikke, hva er en annen løsning som oppnår det samme?

Kommentarer

  • Hvordan ser ViewQuery ut liker?

Svar

Trekker du CAML fra visningen fordi brukere kan oppdatere detaljene i filteret? Hvis ikke, er det sannsynligvis den bedre måten å gjøre opp spørringen manuelt.

Prøv dette:

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

Fordi listen din er> 7 000 elementer, må du også sørge for at en eller begge i kolonnene Stage og PastTransition er indeksert. Kan avhenge av hvilken som returnerer den mindre delmengden av data og i hvilken rekkefølge de blir evaluert.

Du kan også trenge å gjøre «RecursiveAll» i stedet for «Recursive», avhengig av om du vil / trenger å returnere mapper. Vis opptelling av omfang: https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spviewscope.aspx

Dette skal gi deg den filtrerte listen. Derfra kan koden din gjøre hvilken som helst gruppering / bestilling på de returnerte varene.

Oppdatering

Siden spørringsdetaljer må pulses dynamisk fra eksisterende visninger (i henhold til din tilbakemelding nedenfor), kan du trekke innholdet i det eksisterende utsnittet. ViewQuery og injisere det inn i visningen XML ovenfor. Dette vil bli kvitt og tillate også spørringen å kjøre på lister> 5k.

Se Jurgens kode for en fullbakt løsning.

Kommentarer

  • Det fungerer slik. Betyr det at sette opp et CAML-spørsmål og filtrere på indekserte kolonner med et spørresett datasett på mer enn 5000 elementer, vil ikke krasje hvis det returnerte resultatet er mindre enn 5000? Dette er en løsning, men egentlig ikke en løsning. Er det ingen måte å få det fra View? Jeg vil gjerne at spørringen skal opprettes dynamisk fra flere visninger og ikke trenger å gjenskape visningskonfigurasjonen i CAML-spørring hver gang, hvis det er mulig, selvfølgelig. mye 🙂
  • @JurgenCuschieri: Det skal fungere bra hvis det er mer enn 5K listeelementer. Ikke sikker på at jeg ' jeg forstår brukssaken din, men Hvis du vil trekke filterdetaljene ut av visningen (eller visningene) dynamisk, kan du sannsynligvis gjøre det ved å rippe < Forespørsel > del av utsikten ' s CAML og injiserer den dynamisk i < Vis Scrope = " Recusive " > < / Vis >.
  • Jeg ' Jeg prøver det og går tilbake til deg. For å gjøre det litt tydeligere har jeg et system på plass med mange forskjellige spørsmål. CAML-spørring brukes til å laste inn grupper på 5000 artikler i en listeelementsamling. LINQ brukes til å søke etter den resulterende ListItemCollection. Det er unødvendig å si at operasjonen tar lang tid å returnere et resultat. Hvert (eller nesten hvert) scenario er teoretisk knyttet til et syn. noe som betyr at det spørrende datasettet kan minimeres til de samme visningsresultatene. så hvis caml-spørringen automatisk kan fylles ut fra visningen ' s spørring automatisk – er det mer fornuftig, nei?
  • visningene definerer bestemte trinn i et klientfirma ' s forretningsprosess. de CAML-spørringsoperasjonene som brukes spesifikt i et stadium, kan derfor bruke samme spørring som visningen. Dette vil avgrense det søkbare datasettet, i stedet for å bruke alle elementene i listen hver gang
  • Flott! Glad for at det ordnet seg. Us SharePoint-utviklere må holde sammen … 🙂

Svar

Nedenfor er min endelige løsning, basert på @Jim Barntishs svar.

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *