private Entity GetEntity(string type, EntityReference reference)
        {
            if (reference == null)
            {
                return(null);
            }
            var query = _queries.ContainsKey(type)
                ? _queries[type].FirstOrDefault(item => item.EntityName == reference.LogicalName)
                : null;

            if (query == null)
            {
                return(null);
            }
            var condition = new ConditionExpression(_metadataContainer.GetEntityId(reference.LogicalName), ConditionOperator.Equal, reference.Id);

            query.Criteria.Conditions.Add(condition);
            var result = _service.RetrieveMultiple(query).Entities.FirstOrDefault() ?? new Entity(reference.LogicalName);

            query.Criteria.Conditions.Remove(condition);
            OnEntityRetrieved?.Invoke(this, new EntityRetrievedEventArgs
            {
                Entity      = result,
                Key         = type,
                LogicalName = reference.LogicalName
            });
            return(result);
        }
Пример #2
0
        public Placeholder(MetadataManager metadataContainer, string value, int position)
        {
            _metadataContainer = metadataContainer;
            var mask = (int)ZedActivityPartyParticipationTypeMask.Owner;

            if (value.Contains(".from."))
            {
                value = value.Replace(".from.", ".activityid.activityparty.partyid.");
                mask  = (int)ZedActivityPartyParticipationTypeMask.Sender;
            }

            string major;

            (major, Format, Default) = value.SplitFieldValue();

            var parts = major.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);

            if (parts.Length < 3)
            {
                throw new Exception($"Invalid template parameter {value}");
            }

            Position   = position;
            Variable   = parts[0];
            EntityName = metadataContainer.DefineEntityName(parts[1]);

            var alias = string.Empty;
            var root  = new QueryPart(metadataContainer.GetQuery(Variable, EntityName));

            for (var i = 2; i < parts.Length - 1; i += 2)
            {
                var currentField = metadataContainer.DefineField(parts[i], root.EntityName);
                var entity       = metadataContainer.DefineEntityName(parts[i + 1]);
                alias += currentField + entity;
                var link = root.LinkEntities.FirstOrDefault(item => item.LinkFromAttributeName == currentField &&
                                                            item.LinkToEntityName == entity);
                if (link == null)
                {
                    ConditionExpression criterion = null;
                    string entityId;
                    if (entity == "activityparty")
                    {
                        entityId  = "activityid";
                        criterion = new ConditionExpression("participationtypemask", ConditionOperator.Equal, mask);
                    }
                    else
                    {
                        entityId = _metadataContainer.GetEntityId(entity);
                    }
                    link             = root.AddLink(entity, currentField, entityId, criterion);
                    link.EntityAlias = alias;
                }
                root = new QueryPart(link);
            }
            var field = metadataContainer.DefineField(parts[parts.Length - 1], root.EntityName);

            root.AddColumn(field);
            EntityPath = string.IsNullOrWhiteSpace(alias) ? field : $"{alias}.{field}";
        }