Пример #1
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}";
        }