/// <summary> /// Extension method to join the attributes of entity e and otherEntity /// </summary> /// <param name="e"></param> /// <param name="otherEntity"></param> /// <param name="attributes"></param> /// <returns></returns> public static Entity JoinAttributes(this Entity e, Entity otherEntity, ColumnSet columnSet, string alias, XrmFakedContext context) { if (otherEntity == null) { return(e); //Left Join where otherEntity was not matched } otherEntity = otherEntity.Clone(); //To avoid joining entities from/to the same entities, which would cause collection modified exceptions if (columnSet.AllColumns) { foreach (var attKey in otherEntity.Attributes.Keys) { e[alias + "." + attKey] = new AliasedValue(otherEntity.LogicalName, attKey, otherEntity[attKey]); } foreach (var attKey in otherEntity.FormattedValues.Keys) { e.FormattedValues[alias + "." + attKey] = otherEntity.FormattedValues[attKey]; } } else { //Return selected list of attributes foreach (var attKey in columnSet.Columns) { if (!context.AttributeExistsInMetadata(otherEntity.LogicalName, attKey)) { FakeOrganizationServiceFault.Throw(ErrorCodes.QueryBuilderNoAttribute, string.Format("The attribute {0} does not exist on this entity.", attKey)); } if (otherEntity.Attributes.ContainsKey(attKey)) { e[alias + "." + attKey] = new AliasedValue(otherEntity.LogicalName, attKey, otherEntity[attKey]); } else { e[alias + "." + attKey] = new AliasedValue(otherEntity.LogicalName, attKey, null); } if (otherEntity.FormattedValues.ContainsKey(attKey)) { e.FormattedValues[alias + "." + attKey] = otherEntity.FormattedValues[attKey]; } } } return(e); }
public static Entity JoinAttributes(this Entity e, IEnumerable <Entity> otherEntities, ColumnSet columnSet, string alias, XrmFakedContext context) { foreach (var otherEntity in otherEntities) { var otherClonedEntity = otherEntity.Clone(); //To avoid joining entities from/to the same entities, which would cause collection modified exceptions if (columnSet.AllColumns) { foreach (var attKey in otherClonedEntity.Attributes.Keys) { e[alias + "." + attKey] = new AliasedValue(otherEntity.LogicalName, attKey, otherClonedEntity[attKey]); } foreach (var attKey in otherEntity.FormattedValues.Keys) { e.FormattedValues[alias + "." + attKey] = otherEntity.FormattedValues[attKey]; } } else { //Return selected list of attributes foreach (var attKey in columnSet.Columns) { if (!context.AttributeExistsInMetadata(otherEntity.LogicalName, attKey)) { OrganizationServiceFaultQueryBuilderNoAttributeException.Throw(attKey); } if (otherClonedEntity.Attributes.ContainsKey(attKey)) { e[alias + "." + attKey] = new AliasedValue(otherEntity.LogicalName, attKey, otherClonedEntity[attKey]); } else { e[alias + "." + attKey] = new AliasedValue(otherEntity.LogicalName, attKey, null); } if (otherEntity.FormattedValues.ContainsKey(attKey)) { e.FormattedValues[alias + "." + attKey] = otherEntity.FormattedValues[attKey]; } } } } return(e); }
public static Entity ProjectAttributes(this Entity e, QueryExpression qe, XrmFakedContext context) { if (qe.ColumnSet == null) { return(e); } if (qe.ColumnSet.AllColumns) { return(e); //return all the original attributes } else { //Return selected list of attributes in a projected entity Entity projected = null; //However, if we are using proxy types, we must create a instance of the appropiate class if (context.ProxyTypesAssembly != null) { var subClassType = context.FindReflectedType(e.LogicalName); if (subClassType != null) { var instance = Activator.CreateInstance(subClassType); projected = (Entity)instance; projected.Id = e.Id; } else { projected = new Entity(e.LogicalName) { Id = e.Id } }; //fallback to generic type if type not found } else { projected = new Entity(e.LogicalName) { Id = e.Id } }; foreach (var attKey in qe.ColumnSet.Columns) { //Check if attribute really exists in metadata if (!context.AttributeExistsInMetadata(e.LogicalName, attKey)) { OrganizationServiceFaultQueryBuilderNoAttributeException.Throw(attKey); } if (e.Attributes.ContainsKey(attKey) && e.Attributes[attKey] != null) { projected[attKey] = CloneAttribute(e[attKey]); } } //Plus attributes from joins foreach (var le in qe.LinkEntities) { ProjectAttributes(e, projected, le, context); } //foreach (var attKey in e.Attributes.Keys) //{ // if(e[attKey] is AliasedValue && !projected.Attributes.ContainsKey(attKey)) // projected[attKey] = e[attKey]; //} return(projected); } }
public static Entity ProjectAttributes(this Entity e, QueryExpression qe, XrmFakedContext context) { if (qe.ColumnSet == null || qe.ColumnSet.AllColumns) { return(RemoveNullAttributes(e)); //return all the original attributes } else { //Return selected list of attributes in a projected entity Entity projected = null; //However, if we are using proxy types, we must create a instance of the appropiate class if (context.ProxyTypesAssembly != null) { var subClassType = context.FindReflectedType(e.LogicalName); if (subClassType != null) { var instance = Activator.CreateInstance(subClassType); projected = (Entity)instance; projected.Id = e.Id; } else { projected = new Entity(e.LogicalName) { Id = e.Id } }; //fallback to generic type if type not found } else { projected = new Entity(e.LogicalName) { Id = e.Id } }; foreach (var attKey in qe.ColumnSet.Columns) { //Check if attribute really exists in metadata if (!context.AttributeExistsInMetadata(e.LogicalName, attKey)) { FakeOrganizationServiceFault.Throw(ErrorCodes.QueryBuilderNoAttribute, string.Format("The attribute {0} does not exist on this entity.", attKey)); } if (e.Attributes.ContainsKey(attKey) && e.Attributes[attKey] != null) { projected[attKey] = CloneAttribute(e[attKey], context); string formattedValue = ""; if (e.FormattedValues.TryGetValue(attKey, out formattedValue)) { projected.FormattedValues[attKey] = formattedValue; } } } //Plus attributes from joins foreach (var le in qe.LinkEntities) { ProjectAttributes(RemoveNullAttributes(e), projected, le, context); } return(RemoveNullAttributes(projected)); } }
public static Entity ProjectAttributes(this Entity e, QueryExpression qe, XrmFakedContext context) { if (qe.ColumnSet == null) return e; if (qe.ColumnSet.AllColumns) { return e; //return all the original attributes } else { //Return selected list of attributes in a projected entity Entity projected = null; //However, if we are using proxy types, we must create a instance of the appropiate class if (context.ProxyTypesAssembly != null) { var subClassType = context.FindReflectedType(e.LogicalName); if (subClassType != null) { var instance = Activator.CreateInstance(subClassType); projected = (Entity)instance; projected.Id = e.Id; } else projected = new Entity(e.LogicalName) { Id = e.Id }; //fallback to generic type if type not found } else projected = new Entity(e.LogicalName) { Id = e.Id }; foreach (var attKey in qe.ColumnSet.Columns) { //Check if attribute really exists in metadata if (!context.AttributeExistsInMetadata(e.LogicalName, attKey)) { OrganizationServiceFaultQueryBuilderNoAttributeException.Throw(attKey); } if (e.Attributes.ContainsKey(attKey)) projected[attKey] = e[attKey]; else { projected[attKey] = null; } } //Plus attributes from joins foreach(var le in qe.LinkEntities) { ProjectAttributes(e, projected, le, context); } //foreach (var attKey in e.Attributes.Keys) //{ // if(e[attKey] is AliasedValue && !projected.Attributes.ContainsKey(attKey)) // projected[attKey] = e[attKey]; //} return projected; } }
public static Entity JoinAttributes(this Entity e, IEnumerable<Entity> otherEntities, ColumnSet columnSet, string alias, XrmFakedContext context) { foreach (var otherEntity in otherEntities) { var otherClonedEntity = otherEntity.Clone(); //To avoid joining entities from/to the same entities, which would cause collection modified exceptions if (columnSet.AllColumns) { foreach (var attKey in otherClonedEntity.Attributes.Keys) { e[alias + "." + attKey] = new AliasedValue(alias, attKey, otherClonedEntity[attKey]); } } else { //Return selected list of attributes foreach (var attKey in columnSet.Columns) { if (!context.AttributeExistsInMetadata(otherEntity.LogicalName, attKey)) { OrganizationServiceFaultQueryBuilderNoAttributeException.Throw(attKey); } if (otherClonedEntity.Attributes.ContainsKey(attKey)) { e[alias + "." + attKey] = new AliasedValue(alias, attKey, otherClonedEntity[attKey]); } else { e[alias + "." + attKey] = new AliasedValue(alias, attKey, null); } } } } return e; }