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 }