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); }
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}"; }