CAML-lekérdezés a SharePoint Online nézetben

Nagyon nagy könyvtáram van egy SharePoint Online-környezetben:> 3000 (dokumentumkészlet) a gyökérmappában és több mint 7000 (dokumentumkészletek, mappák és dokumentumok) összesen. A rendszer főleg az egyedi kódon alapszik: C # CSOM.

Teljesítmény szempontjából a rendszernek nagy haszna lenne, ha a teljes adatsor részhalmazairól kérdezne, nem pedig minden alkalommal a teljes 7000 elemről (a jelenlegi megoldásom 5000 tételből álló tételeket tölt be egy ListItemCollection-ba: az én esetemben először 5000, majd 2000, majd a lekérdezést a LINQ végzi), különös tekintettel arra, hogy bizonyos műveletek közvetlenül meghatározott nézetekhez vannak kötve.

Az alábbi megvalósítást próbálom meg, ahogyan az egy másik szál megjegyzésében található.

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

Az a kérdésem, hogy a ListItemCollection a gyökérgyűjtemény összes elemével (3000) van feltöltve, amikor a kiválasztott nézetek legfeljebb 60 elemből állnak.

A view.ViewQuery ezzel az értékkel van feltöltve:

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

Állítólag működik a fenti kód? Ha igen, mi a baj? Ha nem, akkor mi a másik megoldás, amellyel ugyanazt érjük el?

Megjegyzések

  • Hogyan néz ki a ViewQuery tetszik?

Válasz

Húzza a CAML-t a nézetből, mert a felhasználók frissíthetik a szűrő részleteit? Ha nem, valószínűleg a lekérdezés kézi feltöltése a jobb út.

Próbálkozzon ezzel:

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

Mivel a listája> 7k elem, azt is meg kell győződnie arról, hogy az egyik vagy mindkettő a Stage és a PastTransition oszlopok indexelésre kerülnek. Attól függhet, hogy melyik adja vissza az adatok kisebb részhalmazát, és milyen sorrendben értékeli őket.

Lehetséges, hogy a „Rekurzív” helyett a „RecursiveAll” műveletet is meg kell tennie, attól függően, hogy mappákat szeretne-e visszaadni / akar. Hatókör-felsorolás megtekintése: https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spviewscope.aspx

Ez megkapja a szűrt listát. Innentől kezdve a kódod bármilyen csoportosítást / megrendelést végezhet a visszaküldött termékeken.

Frissítés

Mivel a lekérdezés részleteit dinamikusan kell pulzálni a meglévő nézetekből (az alábbi visszajelzés alapján), kihúzhatja a meglévő nézet tartalmát. ViewQuery és beadhatja azt a fenti XML nézetbe. Ez megszabadul, és lehetővé teszi a lekérdezés futását> 5k feletti listákon is.

A teljesen elkészített megoldást lásd Jurgen kódjában.

Megjegyzések

  • Ez így működik. A CAML lekérdezés beállítása és az indexelt oszlopok szűrése több mint 5000 elemet tartalmazó lekérdezhető adatsorral nem fog összeomlani, ha a visszaküldött eredmény 5000-nél kevesebb? Ez megkerülhető, de valójában nem megoldás. Szeretném, ha a lekérdezést dinamikusan több nézetből készíteném, és nem kellene minden alkalommal újból létrehoznom a nézet konfigurációját a CAML lekérdezésben, természetesen, ha ez lehetséges. Ez már nagyon jó kezdet! Szóval köszönöm sokat 🙂
  • @JurgenCuschieri: Remekül kell működnie, ha 5K-nál több listaelem van. Nem biztos, hogy ' jól értem a felhasználási esetet, de ha dinamikusan szeretné kihúzni a szűrő részleteit a nézetből (vagy nézetekből), akkor valószínűleg ezt megteheti a < lekérdezés > a nézet része ' s CAML és dinamikus befecskendezése a < View Scrope = " Recusive " > < / Nézet >.
  • Megpróbálom ', és visszatérek hozzád. Hogy egy kicsit világosabb legyen, van egy olyan rendszerem, amely rengeteg különféle kérdést tartalmaz. A CAML lekérdezés 5000 elem kötegeinek betöltésére szolgál a Lista elemek gyűjteményébe. A LINQ a kapott ListItemCollection lekérdezésére szolgál. Mondanom sem kell, hogy a műveletnek sok időbe telik az eredmény megadása. Minden (vagy szinte minden) forgatókönyv elméletileg egy nézethez van kötve. ami azt jelenti, hogy a lekérdezhető adatsor minimalizálható ugyanazokra a nézetekre. tehát ha a caml lekérdezés automatikusan kitölthető a nézetből, akkor a ' lekérdezés automatikusan – van értelme, nem?
  • a nézetek meghatározzák az ügyfélcég bizonyos szakaszait ' üzleti folyamata. azok a CAML lekérdezési műveletek, amelyeket kifejezetten egy szakaszon belül használnak, ezért ugyanazt a lekérdezést használhatják, mint a nézet. Ez pontosítja a lekérdezhető adatsort, ahelyett, hogy minden alkalommal felhasználná a lista összes elemét.
  • Remek! Örülök, hogy sikerült. Nekünk a SharePoint fejlesztőinek össze kell tartaniuk … 🙂

Válasz

Az alábbiakban a végső megoldásom van @Jim Barntish válasza alapján.

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük