Объектная модель клиента SP — добавление нескольких новых элементов в список только с одним ExecuteQuery

Я читал о выполнении только одного запроса после постановки в очередь нескольких элементов для обработки в списке SP.

У меня есть следующий код, где у меня есть кнопка, которая загружает кучу записей в пустой список SP из электронной таблицы Excel. Если я выполняю запрос на выполнение после каждого item.update, он работает... но я думаю, что должен быть лучший способ... где я могу ставить элементы в очередь в массиве и отправлять все элементы сразу. Я вижу примеры того, как это сделать с существующими элементами списка... но я не видел способа сделать это с новыми элементами. Я смог сделать это, удалив элементы... кэшировать их все и выполнить один запрос на выполнение, чтобы удалить все элементы... и это в 1000 раз быстрее, чем eq для каждого, очевидно. Так что постарайтесь сделать то же самое с добавлением новых элементов. Спасибо за любые идеи.

ER

private void buttonAddIndividualApplicants_Click(object sender, EventArgs e)
        {
            logThis("Start adding all individual applicants...");
            //Set up SCOM 
            ClientContext context = new ClientContext(textBoxSPSite.Text);
            List list = context.Web.Lists.GetByTitle(textBoxSPList.Text);
            ListItemCreationInformation itemCreateInfo = new ListItemCreationInformation();
            ListItem oListItem = list.AddItem(itemCreateInfo);

            //ListItemCollection items = new[];

            //Set up Excel
            var package = new ExcelPackage(new FileInfo(GlobalVars.ssFileName));
            ExcelWorksheet workSheet = package.Workbook.Worksheets[GlobalVars.ssApplicantsTab];

            //Start iterating through ss
            for (int i = workSheet.Dimension.Start.Row + 1;
                     i <= workSheet.Dimension.End.Row;
                     i++)
            {
                logThis("Row:" + i);
                string van = workSheet.Cells[i, 1].Value.ToString();
                string appID = workSheet.Cells[i, 2].Value.ToString();
                string name = workSheet.Cells[i, 3].Value.ToString();
                string email = workSheet.Cells[i, 4].Value.ToString();

                logThis(van + "-" + appID + "-" + name + "-" + email + " queued for processing.");

                //Push an item to the stack:
                oListItem["AppID"] = appID;
                oListItem["ApplicantName"] = name;
                oListItem["VAN"] = van;
                oListItem["ApplicantEmailAddress"] = email;
                oListItem.Update();
                //context.ExecuteQuery();  ***with ExecuteQuery here it works

            }
            //After all items pushed onto stack...call ExQuery to apply            
            logThis("Starting ExecuteQuery to process queued list items...");
            context.ExecuteQuery();   //Here it gives me only last name in spreadsheet         
            logThis("FINISHED ADDING INDIVIDUAL APPLICANTS");
        }

person robertsirwin    schedule 20.12.2017    source источник


Ответы (1)


Разобрался. У меня был мой ListItem не в том месте. Это нужно было в моем цикле for, а не вне его. Рабочий код ниже:

private void buttonAddIndividualApplicants_Click(object sender, EventArgs e)
        {
            logThis("Start adding all individual applicants...");
            //Set up SCOM 
            ClientContext context = new ClientContext(textBoxSPSite.Text);
            List list = context.Web.Lists.GetByTitle(textBoxSPList.Text);
            ListItemCreationInformation itemCreateInfo = new ListItemCreationInformation();

            //Set up Excel
            var package = new ExcelPackage(new FileInfo(GlobalVars.ssFileName));
            ExcelWorksheet workSheet = package.Workbook.Worksheets[GlobalVars.ssApplicantsTab];

            //Start iterating through ss
            for (int i = workSheet.Dimension.Start.Row + 1;
                     i <= workSheet.Dimension.End.Row;
                     i++)
            {
                ListItem oListItem = list.AddItem(itemCreateInfo);  //**MOVED ListItem into for loop fixed it
                logThis("Row:" + i);
                string van = workSheet.Cells[i, 1].Value.ToString();
                string appID = workSheet.Cells[i, 2].Value.ToString();
                string name = workSheet.Cells[i, 3].Value.ToString();
                string email = workSheet.Cells[i, 4].Value.ToString();

                logThis(van + "-" + appID + "-" + name + "-" + email + " queued for processing.");

                //Push an item to the stack:
                oListItem["AppID"] = appID;
                oListItem["ApplicantName"] = name;
                oListItem["VAN"] = van;
                oListItem["ApplicantEmailAddress"] = email;
                oListItem.Update();
                //context.ExecuteQuery();
            }
            //After all items pushed onto stack...call ExQuery to apply            
            logThis("Starting ExecuteQuery to process queued list items...");
            context.ExecuteQuery();
            logThis("FINISHED ADDING INDIVIDUAL APPLICANTS");
        }
person robertsirwin    schedule 21.12.2017