Использование 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.


person Moon    schedule 17.11.2015    source источник


Ответы (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 работать, мне пришлось добавить это, используя:

using Microsoft.SharePoint.Client;
person Chris Snyder    schedule 03.12.2015
comment
Да, это будет работать для настраиваемых полей, но не стандартные поля обновляются таким образом. - person Moon; 03.12.2015