SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




CSOM - Löschen von vielen List-Einträgen mit Where-Bedingung

Unbeantwortet Dieser Beitrag hat 3 Antworten

Ohne Rang
47 Beiträge
BenjaminG erstellt 6 Sept. 2016 13:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich muss aus einer Liste ca. 1600 Einträge löschen. Dies mache ich mit einem C#-Programm mit CSOM. Leider dauert der Löschvorgang ca. 7 Minuten. Das ist eindeutig zu lange.

Code:

CamlQuery oQuery = new CamlQuery();
            oQuery.ViewXml   = "<View>" +
                               "  <Query>" +
                               "    <Where>" +
                               "        <Eq>" +
                               "          <FieldRef Name='Variant' />" +
                               "          <Value Type='Text'>VarianteX</Value>" +
                               "        </Eq>" +
                               "    </Where>" +
                               "  </Query" +
                               "  <ViewFields>" +
                               "    <FieldRef Name='ID' />" +
                               "    <FieldRef Name='Variant' />" +
                               "  </ViewFields>" +
                               "</View>";


            ListItemCollection oItemCol = this.oList.GetItems(oQuery);

            ClientContext.Load(oItemCol);
            ClientContext.ExecuteQuery();

            if (oItemCol.Count > 0)
            {
                for (int i = oItemCol.Count - 1; i >= 0; i--)
                {
                    ListItem oItem = oItemCol[i];
                    oItem.DeleteObject();

                    ClientContext.ExecuteQuery();
                }

          }

Wie kann ich dies beschleunigen? Wichtig ist nur, dass ich nicht alle Einträge der Liste löschen darf, deswegen den CamlQuery mit der Where-Bedingung.

Alle Antworten

Ohne Rang
634 Beiträge
Olaf Didszun Als Antwort am 6 Sept. 2016 14:02
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi,

versuch doch mal, den ClientContext.ExecuteQuery() in der for-Schleife außerhalb der Schleife aufzurufen.

Beispiel (allerdings mit JSOM: http://www.vrdmn.com/2013/07/batch-operations-using-javascript.html)

Beste Grüße

Olaf

 

Ohne Rang
47 Beiträge
BenjaminG Als Antwort am 6 Sept. 2016 15:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das funktioniert leider nicht. Da erhalte ich eine Exception:

The request uses too many resources.
at Microsoft.SharePoint.Client.ClientRequest.ProcessResponseStream(Stream responseStream)
   at Microsoft.SharePoint.Client.ClientRequest.ProcessResponse()
   at TOM_SP_DB.ZF.Working.SP.SPListMeasureCardErrors.removeAllEntries()
   at TOM_SP_DB.ZF.Working.Variant.MEA_SP.VariantMEASP.uploadErrors()
   at TOM_SP_DB.Program.Main(String[] args)

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 6 Sept. 2016 15:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann mache doch das ExecuteQuery nur bei jedem 500. Schleifendurchlauf. Oder vielleicht auch nur 100. Du wirst Dich an eine vernünftige Menge selbst rantasten müssen.

Viele Grüße
Andi
af @ evocom de
Blog