示例#1
0
        private void SetRelationshipDetailsAttributes(pavelkh_advancedmultiselectitemsetconfiguration itemSetConfig)
        {
            var pluginContext = this.PluginContext;

            pluginContext.Trace("Filling in Item Set Details...");
            var relationshipName = itemSetConfig.pavelkh_RelationshipName;
            var relationship     = MetadataUtils.GetManyToManyRelationshipMetadata(
                pluginContext,
                relationshipName);

            if (relationship == null)
            {
                throw new InvalidPluginExecutionException(
                          $"{this.GetGenericItemSetSavingErrorMessage(itemSetConfig)} The '{relationshipName}' relationship is not found.");
            }

            var    target            = pluginContext.InputTarget;
            var    currentEntityName = itemSetConfig.pavelkh_EntityName;
            string intersectCurrentEntityRefAttributeName;
            string intersectItemSetEntityRefAttributeName;

            if (relationship.Entity1LogicalName == currentEntityName)
            {
                target.pavelkh_ItemSetEntityName          = relationship.Entity2LogicalName;
                target.pavelkh_EntityAttributeName        = relationship.Entity1IntersectAttribute;
                target.pavelkh_ItemSetEntityAttributeName = relationship.Entity2IntersectAttribute;
                intersectCurrentEntityRefAttributeName    = relationship.Entity1IntersectAttribute;
                intersectItemSetEntityRefAttributeName    = relationship.Entity2IntersectAttribute;
            }
            else
            {
                if (relationship.Entity2LogicalName != currentEntityName)
                {
                    throw new InvalidPluginExecutionException(
                              $"{this.GetGenericItemSetSavingErrorMessage(itemSetConfig)} { currentEntityName } Entity is not associated with the { relationshipName } relationship.");
                }

                target.pavelkh_ItemSetEntityName          = relationship.Entity1LogicalName;
                target.pavelkh_EntityAttributeName        = relationship.Entity2IntersectAttribute;
                target.pavelkh_ItemSetEntityAttributeName = relationship.Entity1IntersectAttribute;

                intersectCurrentEntityRefAttributeName = relationship.Entity2IntersectAttribute;
                intersectItemSetEntityRefAttributeName = relationship.Entity1IntersectAttribute;
            }

            target.pavelkh_IsCustomRelationship            = relationship.IsCustomRelationship;
            target.pavelkh_IntersectEntityName             = relationship.IntersectEntityName;
            target.pavelkh_IntersectEntityRefAttributeName = $"{IntersectLinkedEntityAlias}.{intersectCurrentEntityRefAttributeName}";

            itemSetConfig.pavelkh_ItemSetEntityName = target.pavelkh_ItemSetEntityName;

            #region Figure Out ItemSet Entity PrimaryKey Attribute Name

            var props = new MetadataPropertiesExpression {
                AllProperties = false
            };
            props.PropertyNames.Add("PrimaryIdAttribute");
            var filter = new MetadataFilterExpression();
            filter.Conditions.Add(new MetadataConditionExpression(
                                      "LogicalName",
                                      MetadataConditionOperator.Equals,
                                      target.pavelkh_ItemSetEntityName));
            var query = new EntityQueryExpression {
                Properties = props, Criteria = filter
            };
            var request = new RetrieveMetadataChangesRequest {
                Query = query
            };
            var service        = pluginContext.ServiceAsSystemUser;
            var response       = (RetrieveMetadataChangesResponse)service.Execute(request);
            var entityMetadata = response.EntityMetadata;
            // ReSharper disable PossibleNullReferenceException
            var itemSetEntityPrimaryKeyAttributeName =
                entityMetadata.FirstOrDefault().PrimaryIdAttribute;
            // ReSharper restore PossibleNullReferenceException

            #endregion

            #region Build Additional Fetch Xml Prepared FetchXml Query Templates

            var fetchXmlToQueryRequest = new FetchXmlToQueryExpressionRequest {
                FetchXml = itemSetConfig.pavelkh_FetchXml
            };
            QueryExpression queryExpression;
            try
            {
                queryExpression = ((FetchXmlToQueryExpressionResponse)service.Execute(fetchXmlToQueryRequest)).Query;
            }
            catch (Exception exc)
            {
                throw new InvalidPluginExecutionException(
                          $"Fetch Xml query is not valid. Details: {exc.Message}");
            }

            var itemSetLinkedEntity = queryExpression.AddLink(
                relationship.IntersectEntityName, itemSetEntityPrimaryKeyAttributeName,
                intersectItemSetEntityRefAttributeName, JoinOperator.Inner);
            itemSetLinkedEntity.EntityAlias  = IntersectLinkedEntityAlias;
            itemSetLinkedEntity.LinkCriteria = new FilterExpression();
            itemSetLinkedEntity.LinkCriteria.AddCondition(intersectCurrentEntityRefAttributeName, ConditionOperator.Equal, ItemSetBuilder.FetchXmlEntityIdPlaceHolder);
            var baseColumnSet = new ColumnSet(queryExpression.ColumnSet.Columns.ToArray());
            queryExpression.ColumnSet = new ColumnSet(false);
            var queryToFetchXmlRequest = new QueryExpressionToFetchXmlRequest {
                Query = queryExpression
            };
            var fetchXml = ((QueryExpressionToFetchXmlResponse)service.Execute(queryToFetchXmlRequest)).FetchXml;
            target.pavelkh_FetchXmlForIntersect = fetchXml;

            queryExpression.ColumnSet        = baseColumnSet;
            itemSetLinkedEntity.JoinOperator = JoinOperator.LeftOuter;
            itemSetLinkedEntity.Columns.AddColumn(intersectCurrentEntityRefAttributeName);
            if (itemSetConfig.pavelkh_AutoProcessItemStatus == true)
            {
                var statusAttrName   = itemSetConfig.pavelkh_AutoprocessItemStatusAttributeName;
                var columns          = queryExpression.ColumnSet.Columns;
                var statusAttrExists = columns.Contains(statusAttrName);
                if (!statusAttrExists)
                {
                    columns.Add(statusAttrName);
                }

                var mainFilter          = new FilterExpression(LogicalOperator.And);
                var leftOuterJoinFilter = new FilterExpression(LogicalOperator.Or);
                leftOuterJoinFilter.AddCondition(statusAttrName, ConditionOperator.Equal, 0);
                leftOuterJoinFilter.AddCondition(IntersectLinkedEntityAlias, intersectCurrentEntityRefAttributeName, ConditionOperator.NotNull);
                mainFilter.AddFilter(leftOuterJoinFilter);
                if (queryExpression.Criteria != null)
                {
                    mainFilter.AddFilter(queryExpression.Criteria);
                }

                queryExpression.Criteria = mainFilter;
            }

            queryToFetchXmlRequest = new QueryExpressionToFetchXmlRequest {
                Query = queryExpression
            };
            fetchXml = ((QueryExpressionToFetchXmlResponse)service.Execute(queryToFetchXmlRequest)).FetchXml;
            target.pavelkh_FetchXmlForEditMode = fetchXml;

            #endregion
        }