Sunday, March 26, 2017

Dynamics 365 CRM Optimized QueryExpression snippet to retrieve data from 4 Down Hierarchal entities




Dynamics 365 CRM Optimized QueryExpression snippet to retrieve data from 4 Down Hierarchal entities



 
            QueryExpression userquery = new QueryExpression("systemuser");

            userquery.NoLock = true;

            userquery.Distinct = true;

            userquery.ColumnSet = new ColumnSet("systemuserid", "fullname");

            userquery.Criteria.AddCondition("isdisabled", ConditionOperator.Equal, false);

            LinkEntity elink = new LinkEntity("systemuser", "employee", "employee", "employeeid", JoinOperator.Inner);

            userquery.LinkEntities.Add(elink); 

            LinkEntity celink = new LinkEntity("employee", "connection", "employeeid", "record2id", JoinOperator.Inner);

            elink.LinkEntities.Add(celink);

 

            LinkEntity crlink = new LinkEntity("connection", "connectionrole", "record2roleid", "connectionroleid", JoinOperator.Inner);

            crlink.LinkCriteria.Conditions.Add(new ConditionExpression("category", ConditionOperator.Equal, 206490001));

            if(context.MessageName == "Assign" && context.PrimaryEntityName == "opportunity")

                crlink.LinkCriteria.Conditions.Add(new ConditionExpression("name", ConditionOperator.NotEqual, "OwnerName"));

            celink.LinkEntities.Add(crlink);

            celink.LinkCriteria.AddFilter(LogicalOperator.And);

            LinkEntity olink = new LinkEntity("connection", "opportunity", "record1id", "opportunityid", JoinOperator.Inner);

            olink.LinkCriteria.Conditions.Add(new ConditionExpression("opportunityid", ConditionOperator.Equal, _opptyid));//Pass OpportunityID Value

            celink.LinkEntities.Add(olink);

            var result = ImperService.RetrieveMultiple(userquery);

            foreach (var a in result.Entities)
            {
                if(!_userlist.Contains((Guid)a.Attributes["systemuserid"]))

                    _userlist.Add((Guid)a.Attributes["systemuserid"]);
            }

Advanced Security in Dynamics 365 CRM Using CRM SDK- Grant Access to User for a custom field(Encrypted – FLS enabled) to individual CRM records.



Advanced Security in Dynamics CRM Using CRM SDK- Grant Access to User for a custom field(Encrypted – FLS enabled) to a specific record.

In Dynamics CRM most of the time we assign Field Security profile to grant access to encrypted(FLS) fields which will provide access to the records that users have based on the security role. For certain scenarios we want to limit access to the users to only specific records (not all the records that they have access to) based on the business rule. Below is the snippet which grant access to users for individual CRM records:
if (CAattributeId == Guid.Empty)
                {
                    RetrieveAttributeRequest attrRequest = new RetrieveAttributeRequest()
                    {
                        EntityLogicalName = "opportunity",
                        LogicalName = "new_confidential",
                        RetrieveAsIfPublished = true
                    };
                    RetrieveAttributeResponse attrResponse = (RetrieveAttributeResponse)ImperService.Execute(attrRequest);
 
                    CAattributeId = attrResponse.AttributeMetadata.MetadataId.Value;
                }
                // Share the access
                Entity poaa = new Entity("principalobjectattributeaccess");
                poaa.Attributes.Add("attributeid", CAattributeId);
                poaa.Attributes.Add("objectid", new EntityReference("opportunity", Opptyid));
                poaa.Attributes.Add("principalid", new EntityReference("systemuser", userId));
                poaa.Attributes.Add("readaccess", true);
                poaa.Attributes.Add("updateaccess", false);
// updateaccess = true will allow users to update the field
 
ImperService.Create(poaa);