/// <summary>
        /// Adds the type T as a child linked entity, additionally ensuring it is active.
        /// </summary>
        /// <typeparam name="T">The type of Entity</typeparam>
        /// <param name="link">The link.</param>
        /// <param name="linkFromAttributeName">Name of the link from attribute.</param>
        /// <param name="linkToAttributeName">Name of the link to attribute.</param>
        /// <param name="joinType">Type of the join.</param>
        /// <param name="anonymousTypeInitializer">An Anonymous Type Initializer where the properties of the anonymous
        /// type are the column names to add</param>
        /// <returns></returns>
        public static LinkEntity AddLink <T>(this LinkEntity link, string linkFromAttributeName, string linkToAttributeName, JoinOperator joinType, Expression <Func <T, object> > anonymousTypeInitializer) where T : Entity
        {
            var childLink = link.AddLink(linkFromAttributeName, linkToAttributeName, joinType);

            childLink.Columns.AddColumns(anonymousTypeInitializer);
            return(childLink);
        }
Пример #2
0
 public static LinkEntity AddLink <TFrom, TTo>(this LinkEntity linkEntity,
                                               Expression <Func <TFrom, object> > fromAttribute,
                                               Expression <Func <TTo, object> > toAttribute,
                                               JoinOperator joinOperator)
     where TFrom : Entity
     where TTo : Entity =>
 linkEntity.AddLink(Name <TTo>(), Name(fromAttribute), Name(toAttribute), joinOperator);
Пример #3
0
        /// <summary>
        /// Gets the latest active membership of a member.
        /// </summary>
        public Guid GetLatestActiveMembershipId(string membershipNumber, bool ignoreLifeTimeMemberships = false)
        {
            QueryExpression query = new QueryExpression {
                EntityName = "mag_membership"
            };

            query.Criteria.AddCondition("mag_idnumber", ConditionOperator.Equal, membershipNumber);
            //query.Criteria.AddCondition("statuscode", ConditionOperator.Equal, 809730001); // active
            query.Criteria.AddCondition("statuscode", ConditionOperator.In, new object[] { 809730001, 809730005 }); // active OR service end - PN - 27/11/13

            query.AddOrder("mag_startdate", OrderType.Descending);

            // this is used by the renewal process, lifetime memberships dont need to be renewd
            if (ignoreLifeTimeMemberships)
            {
                LinkEntity le = query.AddLink("product", "mag_membershiptypeid", "productid", JoinOperator.Inner);
                //le.LinkCriteria.AddCondition("name", ConditionOperator.NotEqual, "Lifetime Membership");
                LinkEntity unit = le.AddLink("uom", "defaultuomid", "uomid", JoinOperator.Inner); // Needs to look at the Unit name, as many products can be lifetime memberships - PN - 27/11/13
                unit.LinkCriteria.AddCondition("name", ConditionOperator.NotEqual, "Lifetime");
            }

            EntityCollection results = this._sdk.RetrieveMultiple(query);

            if (results != null && results.Entities != null && results.Entities.Count > 0)
            {
                return(results[0].Get <Guid>("mag_membershipid"));
            }

            return(Guid.Empty);
        }
        public void AddLink2Test()
        {
            // Setup
            string expectedFromEntityName   = EntityFrom.EnityLogicalName;
            string expectedToEntityName     = EntityTo.EnityLogicalName;
            string expectedFromAttributName = nameof(EntityFrom.FromId).ToLower();
            string expectedToAttributName   = nameof(EntityTo.ToId).ToLower();

            LinkEntity linkEntity = new LinkEntity()
            {
                LinkFromEntityName = expectedFromEntityName
            };

            // Act
            LinkEntity newLink = linkEntity.AddLink <EntityFrom, EntityTo>(
                EntityTo.EnityLogicalName,
                f => f.FromId,
                t => t.ToId);

            // Assert
            Assert.AreEqual(expectedFromEntityName, newLink.LinkFromEntityName);
            Assert.AreEqual(expectedToEntityName, newLink.LinkToEntityName);
            Assert.AreEqual(expectedToAttributName, newLink.LinkToAttributeName);
            Assert.AreEqual(expectedFromAttributName, newLink.LinkFromAttributeName);
        }
        /// <summary>
        /// Returns a list of application questions that are applicable to an application
        /// based on the application lines and items linked to the application
        /// </summary>
        /// <param name="applicationId">Guid for the application to check</param>
        /// <returns>A simplified array of application questions and application line ids that are applicable</returns>
        public List <ApplicationQuestionsAndLines> GetApplicableApplicationQuestions(Guid applicationId)
        {
            // 1. Prepare query, start with application line
            QueryExpression query = new QueryExpression(defra_applicationline.EntityLogicalName);

            query.ColumnSet.AddColumns(defra_applicationline.Fields.defra_applicationlineId);
            query.Criteria.AddCondition(defra_applicationline.Fields.StateCode, ConditionOperator.Equal,
                                        (int)defra_applicationlineState.Active);
            query.Criteria.AddCondition(defra_applicationline.Fields.defra_applicationId, ConditionOperator.Equal,
                                        applicationId);

            // 2. Link to Item
            LinkEntity linkItem = query.AddLink(defra_item.EntityLogicalName, defra_item.Fields.defra_itemId,
                                                defra_item.Fields.defra_itemId);

            linkItem.LinkCriteria.AddCondition(defra_item.Fields.StateCode, ConditionOperator.Equal,
                                               (int)defra_itemState.Active);

            // 3. Link to Item Application Question linker table
            LinkEntity linkItemApplicationQuestion = linkItem.AddLink(defra_item_application_question.EntityLogicalName,
                                                                      defra_item.Fields.defra_itemId, defra_item_application_question.Fields.defra_itemid);

            linkItemApplicationQuestion.LinkCriteria.AddCondition(defra_item_application_question.Fields.StateCode,
                                                                  ConditionOperator.Equal, (int)defra_item_application_questionState.Active);
            linkItemApplicationQuestion.Columns.AddColumns(defra_item_application_question.Fields.defra_scope);
            linkItemApplicationQuestion.EntityAlias = "linker";

            // 4. Link to Application Question
            LinkEntity linkQuestion = linkItemApplicationQuestion.AddLink(
                defra_applicationquestion.EntityLogicalName,
                defra_item_application_question.Fields.defra_applicationquestionid,
                defra_applicationquestion.Fields.defra_applicationquestionId);

            linkQuestion.EntityAlias = "question";
            linkQuestion.Columns.AddColumns(defra_applicationquestion.Fields.defra_applicationquestionId);
            linkQuestion.LinkCriteria.AddCondition(defra_applicationquestion.Fields.StateCode, ConditionOperator.Equal,
                                                   (int)defra_applicationquestionState.Active);

            // Talk to CRM, get results
            EntityCollection resultEntities = OrganisationService.RetrieveMultiple(query);

            // No results
            if (resultEntities?.Entities == null || resultEntities.Entities.Count < 1)
            {
                return(null);
            }

            // Return simple model result
            string scopeAttributeName      = $"{linkItemApplicationQuestion.EntityAlias}.{defra_item_application_question.Fields.defra_scope}";
            string questionIdAttributeName = $"{linkQuestion.EntityAlias}.{defra_applicationquestion.Fields.defra_applicationquestionId}";

            return(resultEntities.Entities.Select(entity =>
                                                  new ApplicationQuestionsAndLines
            {
                ApplicationLineId = entity.GetAttributeId(defra_applicationline.Fields.defra_applicationlineId),
                ApplicationQuestionId = entity.GetAliasedAttributeId(questionIdAttributeName),
                Scope = entity.GetAliasedOptionSetValue(scopeAttributeName),
            }).ToList());
        }
Пример #6
0
        public static void AddRequiredQueryJoins(this XrmService xrmService, QueryExpression query, string source)
        {
            var typeFieldPaths   = xrmService.GetTypeFieldPath(source, query.EntityName);
            var splitOutFunction = source.Split(':');

            if (splitOutFunction.Count() > 1)
            {
                source = splitOutFunction.ElementAt(1);
            }
            var splitTokens = source.Split('.');

            if (typeFieldPaths.Count() == 1)
            {
                query.ColumnSet.AddColumn(typeFieldPaths.First().Value);
            }
            else
            {
                LinkEntity thisLink = null;

                for (var i = 0; i < typeFieldPaths.Count() - 1; i++)
                {
                    var lookupField = typeFieldPaths.ElementAt(i).Value;
                    var path        = string.Join(".", splitTokens.Take(i + 1)).Replace("|", "_");
                    if (i == 0)
                    {
                        var targetType    = typeFieldPaths.ElementAt(i + 1).Key;
                        var matchingLinks = query.LinkEntities.Where(le => le.EntityAlias == path);

                        if (matchingLinks.Any())
                        {
                            thisLink = matchingLinks.First();
                        }
                        else
                        {
                            thisLink             = query.AddLink(targetType, lookupField, xrmService.GetPrimaryKeyField(targetType), JoinOperator.LeftOuter);
                            thisLink.EntityAlias = path;
                            thisLink.Columns     = xrmService.CreateColumnSet(new string[0]);
                        }
                    }
                    else
                    {
                        var targetType    = xrmService.GetLookupTargetEntity(lookupField, thisLink.LinkToEntityName);
                        var matchingLinks = thisLink.LinkEntities.Where(le => le.EntityAlias == path);
                        if (matchingLinks.Any())
                        {
                            thisLink = matchingLinks.First();
                        }
                        else
                        {
                            thisLink             = thisLink.AddLink(targetType, lookupField, xrmService.GetPrimaryKeyField(targetType), JoinOperator.LeftOuter);
                            thisLink.EntityAlias = path;
                            thisLink.Columns     = xrmService.CreateColumnSet(new string[0]);
                        }
                    }
                }
                thisLink.Columns.AddColumn(typeFieldPaths.ElementAt(typeFieldPaths.Count() - 1).Value);
            }
        }
Пример #7
0
        public LinkEntity AddLink(string linkToEntityName, string linkFromAttributeName, string linkToAttributeName, ConditionExpression linkCriteria = null)
        {
            var link = _query?.AddLink(linkToEntityName, linkFromAttributeName, linkToAttributeName, JoinOperator.LeftOuter)
                       ?? _link.AddLink(linkToEntityName, linkFromAttributeName, linkToAttributeName, JoinOperator.LeftOuter);

            if (linkCriteria != null)
            {
                link.LinkCriteria.AddCondition(linkCriteria);
            }
            return(link);
        }
Пример #8
0
        private List <CrmEarlyBound.Campaign> GetAllStartedCampaignsThatMarketingListIsAssociated(IOrganizationService service, List listId)
        {
            QueryExpression QEcampaign = new QueryExpression("campaign");

            QEcampaign.ColumnSet.AddColumns("find_mailchimpcampaignid", "name", "find_platformmarketing");
            QEcampaign.Criteria.AddCondition("find_mail_integration_started", ConditionOperator.Equal, false);
            LinkEntity QEcampaign_campaignitem      = QEcampaign.AddLink("campaignitem", "campaignid", "campaignid");
            LinkEntity QEcampaign_campaignitem_list = QEcampaign_campaignitem.AddLink("list", "entityid", "listid");

            QEcampaign_campaignitem_list.LinkCriteria.AddCondition("listid", ConditionOperator.Equal, listId.Id);

            return(service.RetrieveMultiple(QEcampaign).Entities.Select(entity => entity.ToEntity <CrmEarlyBound.Campaign>()).ToList());
        }
Пример #9
0
        public void Can_add_link_generic_from_to_on_link_entity()
        {
            var linkEntity = new LinkEntity
            {
                LinkFromEntityName = xts_entity.EntityLogicalName
            };

            linkEntity.AddLink <xts_entity, xts_relatedentity>(e => e.xts_attribute, e => e.xts_relatedid);

            var linkedLinkEntity = linkEntity.LinkEntities[0];

            Assert.Equal("xts_entity", linkedLinkEntity.LinkFromEntityName);
            Assert.Equal("xts_relatedentity", linkedLinkEntity.LinkToEntityName);
            Assert.Equal("xts_attribute", linkedLinkEntity.LinkFromAttributeName);
            Assert.Equal("xts_relatedid", linkedLinkEntity.LinkToAttributeName);
        }
        private IDictionary <Guid, string> IndexUserTimeZones(List <Guid> usersToNotifyIds)
        {
            var linkEntity = new LinkEntity(Entities.systemuser, Entities.usersettings, Fields.systemuser_.systemuserid, Fields.usersettings_.systemuserid, JoinOperator.Inner);
            var tzLink     = linkEntity.AddLink(Entities.timezonedefinition, Fields.usersettings_.timezonecode, Fields.timezonedefinition_.timezonecode);

            tzLink.EntityAlias = "TZ";
            tzLink.Columns     = XrmService.CreateColumnSet(new[] { Fields.timezonedefinition_.standardname });

            var users = XrmService.RetrieveAllOrClauses(Entities.systemuser
                                                        , usersToNotifyIds.Select(uid => new ConditionExpression(Fields.systemuser_.systemuserid, ConditionOperator.Equal, uid))
                                                        , new string[0]
                                                        , linkEntity);

            return(users
                   .ToDictionary(u => u.Id, u => (string)u.GetFieldValue("TZ." + Fields.timezonedefinition_.standardname)));
        }
Пример #11
0
        public void AddLink2Test()
        {
            // Setup
            string       expectedFromEntityName   = EntityFrom.EnityLogicalName;
            string       expectedToEntityName     = EntityTo.EnityLogicalName;
            string       expectedFromAttributName = nameof(EntityFrom.FromId).ToLower();
            string       expectedToAttributName   = nameof(EntityTo.ToId).ToLower();
            JoinOperator expectedOperator         = JoinOperator.Inner;

            // Act
            LinkEntity <EntityFrom, EntityTo> linkGen = new LinkEntity <EntityFrom, EntityTo>
            {
                LinkFromEntityName = expectedFromEntityName
            };

            LinkEntity newLink = linkGen.AddLink(f => f.FromId, t => t.ToId);

            // Assert
            Assert.AreEqual(expectedFromEntityName, newLink.LinkFromEntityName);
            Assert.AreEqual(expectedToEntityName, newLink.LinkToEntityName);
            Assert.AreEqual(expectedFromAttributName, newLink.LinkFromAttributeName);
            Assert.AreEqual(expectedToAttributName, newLink.LinkToAttributeName);
            Assert.AreEqual(expectedOperator, newLink.JoinOperator);
        }
        private void AddReferenceConfigJoins(LinkEntity linkToReferenced, Entity thisEntity, string field)
        {
            var referencedType       = XrmEntity.GetLookupType(thisEntity.GetFieldValue(field));
            var referencedTypeConfig = XrmRecordService.GetTypeConfigs().GetFor(referencedType);

            if (referencedTypeConfig != null && referencedTypeConfig.UniqueChildFields != null)
            {
                foreach (var uniqueField in referencedTypeConfig.UniqueChildFields)
                {
                    var theValue = thisEntity.GetFieldValue($"{field}.{uniqueField}");
                    if (theValue == null)
                    {
                        linkToReferenced.LinkCriteria.AddCondition(new ConditionExpression(uniqueField, ConditionOperator.Null));
                    }
                    else if (theValue is EntityReference)
                    {
                        var name = XrmEntity.GetLookupName(theValue);
                        var type = XrmEntity.GetLookupType(theValue);
                        var nextLinkToReferenced = linkToReferenced.AddLink(type, uniqueField, XrmService.GetPrimaryKeyField(type));
                        if (name == null)
                        {
                            nextLinkToReferenced.LinkCriteria.AddCondition(XrmService.GetPrimaryNameField(type), ConditionOperator.Null);
                        }
                        else
                        {
                            nextLinkToReferenced.LinkCriteria.AddCondition(XrmService.GetPrimaryNameField(type), ConditionOperator.Equal, name);
                            AddReferenceConfigJoins(nextLinkToReferenced, thisEntity, $"{field}.{uniqueField}");
                        }
                    }
                    else
                    {
                        linkToReferenced.LinkCriteria.AddCondition(new ConditionExpression(uniqueField, ConditionOperator.Equal, XrmService.ConvertToQueryValue(uniqueField, referencedType, theValue)));
                    }
                }
            }
        }
Пример #13
0
        public List <T> ListarPorCriterioDeParaContas(DeParaDeUnidadeDoKonviva objDePara, Guid idUnidadePadrao)
        {
            var query = GetQueryExpression <T>(true);

            #region Condições

            query.ColumnSet = new ColumnSet(true);

            query.Distinct = true;
            #region Status
            query.Criteria.Conditions.Add(new ConditionExpression("statecode", ConditionOperator.Equal, (int)Domain.Enum.StateCode.Ativo));
            #endregion

            query.Criteria.Conditions.Add(new ConditionExpression("itbc_unidadekonvivaid", ConditionOperator.Equal, idUnidadePadrao));

            LinkEntity link = query.AddLink("contact", "itbc_contatoid", "contactid", JoinOperator.Inner);
            link.EntityAlias = "ctt";

            LinkEntity link2 = link.AddLink("account", "parentcustomerid", "accountid", JoinOperator.Inner);
            link2.EntityAlias = "act";

            if (objDePara.Categoria != null)
            {
                LinkEntity link3 = link2.AddLink("itbc_categoriasdocanal", "accountid", "itbc_canalid", JoinOperator.Inner);
                link3.EntityAlias = "cat";
                query.Criteria.AddCondition("cat", "itbc_categoria", ConditionOperator.Equal, objDePara.Categoria.Id);
            }

            query.Criteria.AddCondition("act", "itbc_classificacaoid", ConditionOperator.Equal, objDePara.Classificacao.Id);
            query.Criteria.AddCondition("act", "itbc_subclassificacaoid", ConditionOperator.Equal, objDePara.SubClassificacao.Id);
            query.Criteria.AddCondition("ctt", "statecode", ConditionOperator.Equal, (int)Domain.Enum.CategoriaCanal.StateCode.Ativado);

            #endregion

            return((List <T>) this.RetrieveMultiple(query).List);
        }
Пример #14
0
 /// <summary>
 /// Assumes that the linkFromAttributeName and the linkToAttributeName are the same
 /// </summary>
 /// <param name="link">The link.</param>
 /// <param name="linkToEntityName">Name of the link to entity.</param>
 /// <param name="linkAttributesName">Name of the link from and link to attribute.</param>
 /// <param name="joinType">Type of the join to perform.</param>
 /// <returns></returns>
 public static LinkEntity AddLink(this LinkEntity link, string linkToEntityName, string linkAttributesName, JoinOperator joinType)
 {
     return(link.AddLink(linkToEntityName, linkAttributesName, linkAttributesName, joinType));
 }
Пример #15
0
 /// <summary>
 /// Assumes that the linkFromAttributeName and the linkToAttributeName are the same
 /// </summary>
 /// <param name="link">The link.</param>
 /// <param name="linkToEntityName">Name of the link to entity.</param>
 /// <param name="linkAttributesName">Name of the link from and link to attribute.</param>
 /// <returns></returns>
 public static LinkEntity AddLink(this LinkEntity link, string linkToEntityName, string linkAttributesName)
 {
     return(link.AddLink(linkToEntityName, linkAttributesName, linkAttributesName));
 }
Пример #16
0
 /// <summary>
 /// Adds the type T as a child linked entity, additionally ensuring it is active.
 /// Assumes both entities have the same attribute name to link on.
 /// </summary>
 /// <typeparam name="T">The type of the entity that is to me linked</typeparam>
 /// <param name="link">The link.</param>
 /// <param name="linkAttributesName">Name of the link from and link to attribute.</param>
 /// <param name="joinType">Type of the join to perform.</param>
 /// <param name="anonymousTypeInitializer">An Anonymous Type Initializer where the properties of the anonymous
 /// type are the column names to add</param>
 /// <returns></returns>
 public static LinkEntity AddLink <T>(this LinkEntity link, string linkAttributesName, JoinOperator joinType, Expression <Func <T, object> > anonymousTypeInitializer) where T : Entity
 {
     return(link.AddLink(linkAttributesName, linkAttributesName, joinType, anonymousTypeInitializer));
 }
Пример #17
0
 /// <summary>
 /// Adds the type T as a child linked entity, additionally ensuring it is active.
 /// Assumes both entities have the same attribute name to link on.
 /// </summary>
 /// <typeparam name="T">The type of the entity that is to me linked</typeparam>
 /// <param name="link">The link.</param>
 /// <param name="linkAttributesName">Name of the link from and link to attribute.</param>
 /// <param name="joinType">Type of the join to perform.</param>
 /// <returns></returns>
 public static LinkEntity AddLink <T>(this LinkEntity link, string linkAttributesName, JoinOperator joinType) where T : Entity
 {
     return(link.AddLink <T>(linkAttributesName, linkAttributesName, joinType));
 }
Пример #18
0
 /// <summary>
 /// Adds the type T as a child linked entity to the LinkEntity, additionally ensuring it is active.
 /// Assumes both entities have the same attribute name to link on.
 /// </summary>
 /// <typeparam name="T">The type of the entity that is to be linked</typeparam>
 /// <param name="link">The link.</param>
 /// <param name="linkAttributesName">Name of the link from and link to attribute.</param>
 /// <returns></returns>
 public static LinkEntity AddLink <T>(this LinkEntity link, string linkAttributesName) where T : Entity
 {
     return(link.AddLink <T>(linkAttributesName, linkAttributesName));
 }
Пример #19
0
        public override void PostUpdate(Entity entity, ConnectionHelper helper)
        {
            Entity image = helper.PluginExecutionContext.PostEntityImages["Image"];

            if (entity.Contains("nmc_syncmembers") &&
                entity["nmc_syncmembers"] != null &&
                (bool)entity["nmc_syncmembers"])
            {
                Common.LogToCRM(helper.OrganizationService, $"Marketing list sync triggered: {entity.Id.ToString()}", "Update triggered on marketing list record");

                try
                {
                    #region check config params
                    string apikey = Common.GetParamValue(helper.OrganizationService, "ApiKey");
                    string userid = Common.GetParamValue(helper.OrganizationService, "UserId");
                    string nmList = Common.GetParamValue(helper.OrganizationService, "Default List");

                    if (apikey == null || userid == null || nmList == null)
                    {
                        Common.LogToCRM(helper.OrganizationService, $"Marketing list sync ignored: {entity.Id.ToString()}", "Missing Newsman API configuration!");
                        return;
                    }
                    #endregion

                    using (NewsmanAPI api = new NewsmanAPI(apikey, userid))
                    {
                        #region Generate query criteria
                        int             memberTypeCode = image.GetOptionSetValue("createdfromcode");
                        string          memberType     = memberTypeCode == 1 ? "account" : (memberTypeCode == 2 ? "contact" : "lead");
                        QueryExpression qry            = new QueryExpression(memberType);
                        ColumnSet       cols           = null;
                        switch (memberType)
                        {
                        case "account":
                            cols = new ColumnSet("name", "emailaddress1", "emailaddress2", "emailaddress3");
                            break;

                        case "contact":
                        case "lead":
                            cols = new ColumnSet("firstname", "lastname", "emailaddress1", "emailaddress2", "emailaddress3");
                            break;

                        default:
                            cols = new ColumnSet(false);
                            break;
                        }
                        qry.ColumnSet = cols;
                        LinkEntity listMember = qry.AddLink("listmember", memberType + "id", "entityid", JoinOperator.Inner);
                        LinkEntity list       = listMember.AddLink("list", "listid", "listid");
                        list.LinkCriteria.AddCondition("listid", ConditionOperator.Equal, entity.Id);
                        #endregion

                        #region Send to Newsman
                        StringBuilder importIDs = new StringBuilder();

                        int    totalRecordCount = 0;
                        string segment          = (string)image.GetValue("nmc_newsmansegmentid");
                        qry.PageInfo                        = new PagingInfo();
                        qry.PageInfo.Count                  = 5000;
                        qry.PageInfo.PageNumber             = 1;
                        qry.PageInfo.PagingCookie           = null;
                        qry.PageInfo.ReturnTotalRecordCount = true;
                        EntityCollection members = helper.OrganizationService.RetrieveMultiple(qry);
                        Common.LogToCRM(helper.OrganizationService, $"Started synchronization for {(string)image["listname"]}", $"First page has {members.TotalRecordCount.ToString("N0")} record(s)");
                        totalRecordCount += members.TotalRecordCount;

                        //first batch
                        string importId = api.ImportSubscribers(nmList, segment, Common.CreateSubscribers(members));
                        importIDs.Append($"{importId};");

                        //rest of the batches
                        while (members.MoreRecords)
                        {
                            members  = helper.OrganizationService.RetrieveMultiple(qry);
                            importId = api.ImportSubscribers(nmList, segment, Common.CreateSubscribers(members));
                            importIDs.Append($"{importId};");
                            qry.PageInfo.PageNumber++;
                            qry.PageInfo.PagingCookie = members.PagingCookie;
                            totalRecordCount         += members.TotalRecordCount;
                        }
                        ;
                        Common.LogToCRM(helper.OrganizationService, $"Finished synchronization for {(string)image["listname"]}", $"Total number of records is: {totalRecordCount.ToString("N0")}. List of generated Newsman import ids: {importIDs.ToString()}");
                        #endregion
                    }
                }
                catch (Exception ex)
                {
                    Common.LogToCRM(helper.OrganizationService, $"Error syncing list members for {(string)image["listname"]}", $"Error message:{ex.Message}, stack trace: {ex.StackTrace}");
                }
                finally
                {
                    Entity resetList = new Entity(entity.LogicalName, entity.Id);
                    resetList.Attributes["nmc_syncmembers"] = false;
                    helper.OrganizationService.Update(resetList);
                }
            }
        }
Пример #20
0
        /// <summary>
        ///     Return the entity record which is configured as the logical parent of this records autonumber
        /// </summary>
        public Entity GetParentEntity(Entity entity, XrmAutonumber autonumber, IEnumerable <string> fields)
        {
            //Need to split the links to the parent and create a query which returns the parent record via the links
            if (!entity.Contains(autonumber.FirstLinkLookup))
            {
                return(null);
            }

            //Create a query which traverses through the keys and entities we defined in our autonumber links
            var query = new QueryExpression();

            query.ColumnSet = XrmService.CreateColumnSet(fields);
            LinkEntity carry = null;

            //for each foreign key entity pairing work from last to first
            for (var i = autonumber.LinksToParent.LinkToParents.Count(); i > 0; i--)
            {
                var thisLink = autonumber.LinksToParent.LinkToParents.ElementAt(i - 1);
                //if this is the last item we need to create it as the type of entity we are returning
                if (i == autonumber.LinksToParent.LinkToParents.Count())
                {
                    query.EntityName = thisLink.LinkTarget;
                }
                //otherwise if this is not the last item we need to add a link from the previous type to this type
                else
                {
                    var previousPair = autonumber.LinksToParent.LinkToParents.ElementAt(i);
                    if (carry == null)
                    {
                        carry = query.AddLink(thisLink.LinkTarget, previousPair.LinkFieldTarget, previousPair.LinkFieldSource);
                    }
                    else
                    {
                        carry = carry.AddLink(thisLink.LinkTarget, previousPair.LinkFieldTarget, previousPair.LinkFieldSource);
                    }
                }
                //if this is the first item we need to add a filter on the first id with the value in the lookup from the record we are creating the autonumber for
                if (i == 1)
                {
                    var thisLookupId = entity.GetLookupGuid(thisLink.LinkFieldSource);
                    if (!thisLookupId.HasValue)
                    {
                        return(null);
                    }
                    if (autonumber.LinksToParent.LinkToParents.Count() != 1)
                    {
                        carry.LinkCriteria.AddCondition(carry.LinkToEntityName + "id", ConditionOperator.Equal, thisLookupId.Value);
                    }
                    else
                    {
                        query.Criteria.AddCondition(query.EntityName + "id", ConditionOperator.Equal, thisLookupId.Value);
                    }
                }
            }
            //Run the query and if a result return it
            var parent = XrmService.RetrieveMultiple(query);

            if (parent.Entities.Count > 0)
            {
                return(parent.Entities[0]);
            }
            return(null);
        }