3

我有以下代码可以更新某些任务字段。这段代码的问题是,我必须在逐个更新每个任务后发布整个项目。例如,如果我有 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 桌面应用程序那样。

4

1 回答 1

0

对于它的价值,我能够创建一堆任务,然后使用此代码通过一次发布更新所有新/现有任务的自定义字段:

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;
于 2015-12-03T15:06:56.020 回答