none
USING C# CSOM To Update a resource field RRS feed

  • Question

  • Hi

    I am using C# CSOM to update the timesheet manager of a resource. My code works but it takes too long. I have a feeling that even though I retrieve a single user in the enterprise pool and execute on that one resource, its still doing something to the entire resource pool. Any tips would be appreciated. Its taking about 3-5 mins to update a single resource and I need update about 3000 resources.

           private void UpdateResourcesEmailAddresses()
            {
                try
                {
                    using (ProjectContext projectContext = new ProjectContext(ProjectOnlineUrl))
                    {
                        SecureString securePwd = new SecureString();
                        foreach (var c in ProjectOnlineLoginPassword.ToCharArray()) securePwd.AppendChar(c);

                        projectContext.Credentials = new SharePointOnlineCredentials(ProjectOnlineLoginAccount, securePwd);

                        projectContext.RequestTimeout = 1000 * 60 * 5;

                        projectContext.ExecuteQuery();

                        var resources = GetProjectOnlineResourcesToUpdateMetadata().ToList();

                        foreach (var poResource in resources)
                        {
                            AddResourceToTimesheetMetadatLog(poResource);

                            string emailAddress = poResource.EmailAddress;
                            Guid resourceId = poResource.ResourceId;

                            projectContext.Load(projectContext.EnterpriseResources, c => c.Where(p => p.Id == resourceId).IncludeWithDefaultProperties(p => p.User));
                            projectContext.ExecuteQuery();

                            var resource = projectContext.EnterpriseResources.FirstOrDefault();
                            var user = resource.User;

                            try
                            {
                                if (resource != null)
                                {
                                    resource.Email = emailAddress;

                                    if(poResource.EmployeeNumber.ToUpper().StartsWith("C"))
                                    {
                                        resource.DefaultAssignmentOwner = user;
                                    }
                                    else
                                    {
                                        resource.TimesheetManager = user;
                                        resource.DefaultAssignmentOwner = user;
                                    }
                                    projectContext.EnterpriseResources.Update();
                                    projectContext.ExecuteQuery();
                                    UpdateResourceTimesheetMetadataEmailStatus(poResource, 1, "Processed Succesfully");
                                    if(resource.IsCheckedOut)
                                    {
                                        resource.ForceCheckIn();
                                    }
                                 }
                                else
                                {
                                    UpdateResourceTimesheetMetadataEmailStatus(poResource, 0, string.Format("Cant find resource with email address {0}", emailAddress));
                                }
                            }
                            catch (Exception ex)
                            {
                                UpdateResourceTimesheetMetadataEmailStatus(poResource, 0, string.Format("Error updating resource {0}", ex.Message));
                             }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    //throw;
                }
            }

    Thursday, February 2, 2017 11:11 AM

All replies