示例#1
0
        /// <summary>
        /// 根据冗余路径从当前对象开始搜索,获取真实的属性值。
        /// </summary>
        /// <param name="path"></param>
        /// <param name="from">
        /// 本对象在路径中拥有的引用属性。
        /// 在 D->C->B->A.Name 场景中,当前对象(this)可能是 C,那么 from 就是 C.BRefProperty.
        /// 如果没有指定此属性,则表示从第一个开始。
        /// </param>
        /// <returns></returns>
        internal object GetRedundancyValue(RedundantPath path, IRefIdProperty from = null)
        {
            Entity refEntity = this;

            foreach (var refP in path.RefPathes)
            {
                if (from != null && refP.Property != from)
                {
                    continue;
                }

                refEntity = refEntity.GetRefEntity((refP.Property as IRefProperty).RefEntityProperty);
                if (refEntity == null)
                {
                    break;
                }
            }

            object value = null;

            if (refEntity != this && refEntity != null)
            {
                value = refEntity.GetProperty(path.ValueProperty.Property);
            }

            return(value);
        }
示例#2
0
        private static object GetRootId(Entity entity)
        {
            var parentPropertyMeta = entity.GetRepository().EntityMeta.FindParentReferenceProperty();

            if (parentPropertyMeta == null)
            {
                return(entity.Id);
            }

            var refMP  = parentPropertyMeta.ManagedProperty.CastTo <IRefEntityProperty>();
            var parent = entity.GetRefEntity(refMP);

            return(GetRootId(parent));
        }
        private void DeepSearchRecur_Instance(Entity entity)
        {
            var values = entity.GetNonDefaultPropertyValues();

            foreach (var value in values)
            {
                var mp = value.Property as IProperty;
                switch (mp.Category)
                {
                case PropertyCategory.ReferenceEntity:
                    if (mp.GetMeta(entity).Serializable)
                    {
                        var refEntity = entity.GetRefEntity(mp as IRefEntityProperty);
                        AddEntityType(refEntity.GetType());
                        DeepSearchRecur_Instance(refEntity);
                    }
                    break;

                case PropertyCategory.List:
                    if (mp.GetMeta(entity).Serializable)
                    {
                        var list = entity.GetLazyList(mp as IListProperty);
                        for (int i = 0, c = list.Count; i < c; i++)
                        {
                            var child = list[i];
                            if (i == 0)
                            {
                                AddEntityType(child.GetType());
                            }
                            DeepSearchRecur_Instance(child);
                        }
                    }
                    break;

                default:
                    break;
                }
            }
        }