/// <summary> /// Deserializes a surrogate object. /// </summary> /// <param name="value">The surrogate.</param> /// <returns>The object.</returns> private static object Deserialize(object value) { // convert from surrogate type to actual type if (value is long) { // for object references, the default json numeric type is long but the end result should be int return(Convert.ToInt32(value)); } if (value is JsonGuid) { return(new Guid(((JsonGuid)value).Value)); } if (value is JsonEntityFilters) { return((EntityFilters)((JsonEntityFilters)value).Value); } if (value is JsonList <KeyValuePair <Relationship, QueryBase> > ) { var dictionary = new RelationshipQueryCollection(); dictionary.AddRange(((JsonList <KeyValuePair <Relationship, QueryBase> >)value).Value); return(dictionary); } return(value); }
//TODO: update to also take in cascading filtering on Assign, Delete, Merge, reparent, rollup internal Entity GetDbEntityWithRelatedEntities(EntityReference reference, EntityRole primaryEntityRole, EntityReference userRef, CascadeSelection cascadeSelection = null, params Relationship[] relations) { var entity = db.GetEntityOrNull(reference); if (entity == null) { return(null); } var metadata = this.metadata.EntityMetadata.GetMetadata(entity.LogicalName); if (entity.RelatedEntities.Count() > 0) { var clone = entity.CloneEntity(metadata, new ColumnSet(true)); db.Update(clone); entity = clone; } var relationQuery = new RelationshipQueryCollection(); var relationsMetadata = primaryEntityRole == EntityRole.Referenced ? metadata.OneToManyRelationships : metadata.ManyToOneRelationships; if (cascadeSelection != null) { relationsMetadata.Where(x => CascadeCompare(x.CascadeConfiguration, cascadeSelection)); } if (relations.Any()) { relationsMetadata = relationsMetadata.Join(relations, x => x.SchemaName, y => y.SchemaName, (r1, r2) => r1).ToArray(); } relationQuery.AddRange( relationsMetadata .Select(relationshipMeta => { var rel = new Relationship() { SchemaName = relationshipMeta.SchemaName, PrimaryEntityRole = primaryEntityRole }; var query = new QueryExpression() { EntityName = primaryEntityRole == EntityRole.Referenced ? relationshipMeta.ReferencingEntity : relationshipMeta.ReferencedEntity, ColumnSet = new ColumnSet(true) }; return(new KeyValuePair <Relationship, QueryBase>(rel, query)); })); foreach (var relationshipMeta in relationsMetadata) { } if (cascadeSelection == null) { var relationShipManyMetadata = metadata.ManyToManyRelationships; if (relations.Any()) { relationShipManyMetadata = relationShipManyMetadata.Join(relations, x => x.SchemaName, y => y.SchemaName, (r1, r2) => r1).ToArray(); } relationQuery.AddRange(relationShipManyMetadata .Select(relationshipMeta => { var rel = new Relationship() { SchemaName = relationshipMeta.SchemaName }; var query = new QueryExpression(relationshipMeta.IntersectEntityName) { ColumnSet = new ColumnSet(true) }; return(new KeyValuePair <Relationship, QueryBase>(rel, query)); })); } AddRelatedEntities(entity, relationQuery, userRef); return(entity); }