예제 #1
0
        /// <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);
        }
예제 #2
0
파일: Core.cs 프로젝트: reager/XrmMockup
        //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);
        }