Использование CSOM для обновления нескольких задач только с одной публикацией проекта

У меня есть следующий код, который обновляет определенные поля задачи. Проблема с этим кодом заключается в том, что мне приходится публиковать весь проект после обновления каждой задачи по одному. Так, например, если бы у меня было 500 задач для обновления, проект пришлось бы публиковать 500 раз. Как видите, это полностью излишне, медленно и не нужно.

using (ProjectContext projectContext = GetClientContext(psCred))
{
    projectContext.Load(projectContext.Projects);
    projectContext.ExecuteQuery();

    foreach (var project in projectContext.Projects)
    {
        var draftProject = project.CheckOut();
        projectContext.Load(draftProject.Tasks);
        projectContext.ExecuteQuery();

        projectContext.Load(draftProject.Task);
        projectContext.ExecuteQuery();

        foreach (var task in draftProject.Tasks)
        {
            task["FIELD"] = "VALUE";

            var job = draftProject.Update();
            projectContext.WaitForQueue(job, int.MaxValue);

            job = draftProject.Publish(true);
            projectContext.WaitForQueue(job, int.MaxValue);
        }
    }
}

Я надеюсь, что есть способ обновить все задачи проекта за один раз, выполнив в конце только одну публикацию, как это делает настольное приложение Microsoft Project.

1 ответ

Что бы это ни стоило, я смог создать группу задач, а затем использовать этот код для обновления настраиваемого поля для всех новых / существующих задач с помощью одной публикации:

DraftProject projCheckedOut = proj2Edit.CheckOut();

_projContext.Load(projCheckedOut.Tasks, ts => 
    ts.Include(
        t => t.Id, 
        t => t.Name, 
        t => t.CustomFields, 
        t => t.OutlineLevel,
        t => t.IsSummary));
_projContext.ExecuteQuery();

// Lookup custom field internal name from our StringDictionary
string intNamePref = _customFields["Custom Field1"];

var tasks = projCheckedOut.Tasks;

foreach (var t in tasks)
{
    t[intNamePref] = 2;
}
projCheckedOut.Publish(true);
_projContext.ExecuteQuery();

Совет: чтобы заставить работать.Include lambda, мне пришлось добавить это с помощью:

using Microsoft.SharePoint.Client;
Другие вопросы по тегам