internal static EntityReference GetBusinessUnit(XrmDb db, EntityReference owner) { var user = db.GetEntityOrNull(owner); if (user == null) { return(null); } var buRef = user.GetAttributeValue <EntityReference>("businessunitid"); var bu = db.GetEntityOrNull(buRef); if (bu == null) { return(null); } buRef.Name = bu.GetAttributeValue <string>("name"); return(buRef); }
internal static void PopulateEntityReferenceNames(Entity entity, EntityMetadata metadata, XrmDb db) { foreach (var attr in entity.Attributes) { if (attr.Value is EntityReference eRef) { var nameAttr = metadata.PrimaryNameAttribute; eRef.Name = db.GetEntityOrNull(eRef)?.GetAttributeValue <string>(nameAttr); } } }
internal void AddRelatedEntities(Entity entity, RelationshipQueryCollection relatedEntityQuery, EntityReference userRef) { foreach (var relQuery in relatedEntityQuery) { var relationship = relQuery.Key; var queryExpr = relQuery.Value as QueryExpression; if (queryExpr == null) { queryExpr = XmlHandling.FetchXmlToQueryExpression(((FetchExpression)relQuery.Value).Query); } var relationshipMetadata = Utility.GetRelatedEntityMetadata(metadata.EntityMetadata, queryExpr.EntityName, relationship.SchemaName); var oneToMany = relationshipMetadata as OneToManyRelationshipMetadata; var manyToMany = relationshipMetadata as ManyToManyRelationshipMetadata; if (oneToMany != null) { if (relationship.PrimaryEntityRole == EntityRole.Referencing) { var entityAttributes = db.GetEntityOrNull(entity.ToEntityReference()).Attributes; if (entityAttributes.ContainsKey(oneToMany.ReferencingAttribute) && entityAttributes[oneToMany.ReferencingAttribute] != null) { var referencingGuid = Utility.GetGuidFromReference(entityAttributes[oneToMany.ReferencingAttribute]); queryExpr.Criteria.AddCondition( new ConditionExpression(oneToMany.ReferencedAttribute, ConditionOperator.Equal, referencingGuid)); } } else { queryExpr.Criteria.AddCondition( new ConditionExpression(oneToMany.ReferencingAttribute, ConditionOperator.Equal, entity.Id)); } } if (manyToMany != null) { if (db[manyToMany.IntersectEntityName].Count() > 0) { var conditions = new FilterExpression(LogicalOperator.Or); if (entity.LogicalName == manyToMany.Entity1LogicalName) { queryExpr.EntityName = manyToMany.Entity2LogicalName; var relatedIds = db[manyToMany.IntersectEntityName] .Where(row => row.GetColumn <Guid>(manyToMany.Entity1IntersectAttribute) == entity.Id) .Select(row => row.GetColumn <Guid>(manyToMany.Entity2IntersectAttribute)); foreach (var id in relatedIds) { conditions.AddCondition( new ConditionExpression(null, ConditionOperator.Equal, id)); } } else { queryExpr.EntityName = manyToMany.Entity1LogicalName; var relatedIds = db[manyToMany.IntersectEntityName] .Where(row => row.GetColumn <Guid>(manyToMany.Entity2IntersectAttribute) == entity.Id) .Select(row => row.GetColumn <Guid>(manyToMany.Entity1IntersectAttribute)); foreach (var id in relatedIds) { conditions.AddCondition( new ConditionExpression(null, ConditionOperator.Equal, id)); } } queryExpr.Criteria = conditions; } } var entities = new EntityCollection(); if ((oneToMany != null || manyToMany != null) && queryExpr.Criteria.Conditions.Count > 0) { var handler = RequestHandlers.Find(x => x is RetrieveMultipleRequestHandler); var req = new RetrieveMultipleRequest { Query = queryExpr }; var resp = handler.Execute(req, userRef) as RetrieveMultipleResponse; entities = resp.EntityCollection; } if (entities.Entities.Count() > 0) { entity.RelatedEntities.Add(relationship, entities); } } }