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