CAML-kysely SharePoint Online -näkymässä

Minulla on erittäin suuri kirjasto SharePoint Online -ympäristössä:> 3000 (asiakirjajoukot) juurikansiossa ja yli 7000 (asiakirjasarjat, kansiot ja asiakirjat) yhteensä. Järjestelmä perustuu pääasiassa mukautettuun koodiin: C # CSOM.

Suorituskykyä ajatellen järjestelmä hyötyisi suuresti kyselystä koko tietojoukon osajoukoista, pikemminkin koko 7000 kohteesta joka kerta (nykyinen ratkaisuni lataa 5000 erän erät ListItemCollection: minun tapauksessani ensin 5000 ja sitten 2000, ja sitten kyselyn suorittaa LINQ) erityisesti ottaen huomioon, että tietyt toiminnot ovat suoraan sidoksissa tiettyihin näkymiin.

Yritän alla olevaa toteutusta, joka löytyy toisen ketjun kommentista.

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

Minun ongelmani on, että ListItemCollection täytetään kaikkien juurikokoelman (3000) kohteiden kanssa, kun valitut näkymät muodostavat enintään 60 kohdetta.

View.ViewQuery täytetään tällä arvolla:

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

Onko yllä olevan koodin tarkoitus toimia? Jos kyllä, mikä on väärin? Jos ei, mikä on toinen ratkaisu, jolla saavutetaan sama asia?

Kommentit

  • miltä ViewQuery näyttää kuten?

Vastaa

Vedätkö CAML: ää näkymästä, koska käyttäjät saattavat päivittää suodattimen tiedot? Jos ei, kyselyn manuaalinen luominen on todennäköisesti parempi tapa edetä.

Kokeile:

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

Koska luettelosi on> 7 kt, sinun on myös varmistettava, että yksi tai molemmat Stage- ja PastTransition-sarakkeet indeksoidaan. Voi riippua siitä, kumpi palauttaa pienemmän osajoukon ja missä järjestyksessä ne arvioidaan.

Saatat myös joutua tekemään ”RecursiveAll” ”Rekurssiivisen” sijaan sen mukaan, haluatko / haluatko palauttaa kansioita. Näytä laajuusluettelo: https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spviewscope.aspx

Tämän pitäisi saada suodatettu luettelo. Sieltä koodisi voi tehdä minkä tahansa ryhmittelyn tai tilauksen palautetuille tuotteille.

Päivitä

Koska kyselyn yksityiskohdat on annettava dynaamisesti olemassa olevista näkymistä (alla olevan palautteen mukaan), voit vetää sisällön olemassa olevasta näkymästä. yllä olevaan XML-näkymään. Tämä päästä eroon ja antaa kyselyn myös suorittaa luetteloissa> 5k.

Katso Jurgenin koodista täysin paistettu ratkaisu.

Kommentit

  • Se toimii näin. Tarkoittaako se sitä CAML-kyselyn asettaminen ja suodatus hakemistosarakkeisiin, joissa on kysyttävä tietojoukko yli 5000 kohdetta, ei kaatu, jos palautettu tulos on alle 5000? Tämä on kiertotapa, mutta ei oikeastaan ratkaisu. Eikö ole mitään keinoa saada Haluaisin, että kysely luodaan dynaamisesti useista näkymistä, eikä minun tarvitse luoda näkymän kokoonpanoa CAML-kyselyssä joka kerta, jos se on tietysti mahdollista. Tämä on kuitenkin erittäin hyvä alku! Joten kiitos paljon 🙂
  • @JurgenCuschieri: Sen pitäisi toimia hyvin, jos luettelokohteita on yli 5 000 kappaletta. En ole varma, ymmärränkö täysin käyttötapauksesi, mutta <

Jos haluat vetää suodattimen yksityiskohdat dynaamisesti näkymästä (tai näkymistä), voit todennäköisesti tehdä sen repimällä < kyselyn > näkymän osa ' s CAML ja ruiskuttamalla se dynaamisesti < View Scrope = " Recusive " > < / Näytä >.

  • Yritän sitä ' ja palaan takaisin sinulle. Jotta asia olisi hieman selkeämpi, minulla on käytössä järjestelmä, jossa on paljon erilaisia kyselyitä. CAML-kyselyä käytetään 5000 kohteen erien lataamiseen luettelokohde-kokoelmaan. LINQia käytetään saadun ListItemCollection-kyselyn tekemiseen. Tarpeetonta sanoa, että toimenpide vie kauan aikaa tuloksen palauttamiseksi. Jokainen (tai melkein jokainen) skenaario on teoreettisesti sidottu näkymään. mikä tarkoittaa, että haettava tietojoukko voidaan minimoida samoihin näkymiin. joten jos caml-kysely voidaan automaattisesti täyttää näkymästä ' kysely automaattisesti – on järkevämpää, eikö?
  • näkymissä määritetään tietyt vaiheet asiakasyrityksessä ' s liiketoimintaprosessi. ne CAML-kyselyoperaatiot, joita käytetään nimenomaan vaiheessa, voivat siksi käyttää samaa kyselyä kuin näkymä. Tämä tarkentaa kyseltävää tietojoukkoa sen sijaan, että käyttää kaikkia luettelon kohteita joka kerta.
  • Hienoa! Onneksi se onnistui. Meidän SharePoint-kehittäjien on pidettävä kiinni … 🙂
  • Vastaa

    Alla on viimeinen ratkaisuni, perustuu @Jim Barntishin vastaukseen.

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

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *