/// <summary>
        /// Execute FetchXMl query to retrieve related data
        /// </summary>
        /// <param name="relatedQuery">Related query</param>
        /// <param name="primaryEntity">primary entity</param>
        /// <param name="parameters">list of parameters attribute</param>
        /// <param name="filter">list of filter which need to apply</param>
        /// <param name="service">organization service</param>
        /// <returns>collection of related entities</returns>
        internal static EntityCollection RetrieveRelatedEntity(Entity relatedQuery, Entity primaryEntity, Dictionary <string, dynamic> parameters, List <QueryFilter> filter, IOrganizationService service)
        {
            if (relatedQuery.Contains("didd_query") && relatedQuery.Contains("didd_sequencenumber"))
            {
                // Query string in from of fetchXMl
                string queryString = Convert.ToString(relatedQuery.Attributes["didd_query"], CultureInfo.InvariantCulture);

                // Replace Placeholder in query string
                string query = NotificationTokenReplacer.ReplacePlaceHolders(null, primaryEntity, parameters, string.Empty, queryString);

                // get filter to apply for query string
                var queryFilter = filter.Where(x => x.SequenceNumber == (int)relatedQuery.Attributes["didd_sequencenumber"]).OrderBy(o => o.SubsequenceNumber).ToList <QueryFilter>();

                // add filter in query string
                List <string> param = new List <string>();
                foreach (var lst in queryFilter)
                {
                    param.Add(lst.Value);
                }

                // Execute query string
                FetchExpression fetchQuery = new FetchExpression(string.Format(CultureInfo.InvariantCulture, query, param.ToArray <string>()));
                return(service.RetrieveMultiple(fetchQuery));
            }
            else
            {
                throw new InvalidPluginExecutionException(string.Format(CultureInfo.InvariantCulture, "Notification Template Data Query is not configured properly. Please contact administrator."));
            }
        }
        /// <summary>
        /// Get Party List through custom query
        /// </summary>
        /// <param name="customQuery">custom query</param>
        /// <param name="primaryEntity">primary record</param>
        /// <param name="parameters">list of parameters attribute</param>
        /// <param name="service">organization service</param>
        /// <returns>collection of custom party</returns>
        internal static EntityCollection GetCustomPartyList(string customQuery, Entity primaryEntity, Dictionary <string, dynamic> parameters, IOrganizationService service)
        {
            // execute fetch query dynamically for custom party list
            string          fetchPartyListQuery = NotificationTokenReplacer.ReplacePlaceHolders(null, primaryEntity, parameters, null, customQuery);
            FetchExpression fetchQuery          = new FetchExpression(fetchPartyListQuery);

            return(service.RetrieveMultiple(fetchQuery));
        }