Here is the code for sharing record with multiple users in single shot. It’s simple but effective.
private void MultiShare(IOrganizationService service)
{
//Initializes a new instance of the OrganizationRequestCollection class
OrganizationRequestCollection orgReqCollection = new OrganizationRequestCollection();
string[] userId=new string[4];
userId[0] = “B6CD6291-103F-E411-A66F-A4BADB09B4C2”;
userId[1] = “F9245526-4F42-E411-9DD5-00505696000A”;
userId[2] = “4CE84620-4F42-E411-9DD5-00505696000A”;
userId[3] = “51DD0950-8E78-E311-86B2-A4BADB09B4C2”;
foreach (string s in userId)
{
EntityReference TargetEntity = new EntityReference(“opportunity”, new Guid(“9F260320-E255-E411-93F3-00505696011C”));
EntityReference TargetShare=new EntityReference(“systemuser”,new Guid(s));
//Call the CreateCollection function to prepare the OrganizationRequestCollection class object
orgReqCollection = CreateCollection(TargetEntity, TargetShare, orgReqCollection );
}
// Intialize ExecuteMultipleRequest
ExecuteMultipleRequest executeMutlipleRequest = new ExecuteMultipleRequest();
executeMutlipleRequest.Requests = orgReqCollection;
executeMutlipleRequest.Settings = new ExecuteMultipleSettings();
// ContinueOnError – specifies whether to continue in case of error in any of the request or not
executeMutlipleRequest.Settings.ContinueOnError = false;
// ReturnResponses – specifies whether to return responses for the requests or not
executeMutlipleRequest.Settings.ReturnResponses = true;
ExecuteMultipleResponse executeMulResponse = (ExecuteMultipleResponse)service.Execute(executeMutlipleRequest);
}
//To share the record
private OrganizationRequestCollection CreateCollection(EntityReference TargetEntity, EntityReference TargetShare, OrganizationRequestCollection orgReqCollection )
{
GrantAccessRequest grant = new GrantAccessRequest();
grant.Target = new EntityReference(TargetEntity.LogicalName, TargetEntity.Id);
PrincipalAccess principal = new PrincipalAccess();
principal.Principal = new EntityReference(TargetShare.LogicalName, TargetShare.Id);
principal.AccessMask = AccessRights.ReadAccess | AccessRights.AppendAccess | AccessRights.WriteAccess | AccessRights.AppendToAccess | AccessRights.ShareAccess | AccessRights.AssignAccess;
grant.PrincipalAccess = principal;
orgReqCollection.Add(grant);
return orgReqCollection;
}
This is the way you can share record with multiple user without executing multiple requests each time.
Namaste 🙂
Megh