Esempio n. 1
0
        /// <summary>
        /// 根据 optionNode 中的描述信息,读取 table 中的数据组装为对象列表并返回。
        /// 如果 optionNode 中指定要加载更多的子/引用对象,则会递归调用自己实现聚合加载。
        /// </summary>
        /// <param name="list">The list.</param>
        /// <param name="table">The table.</param>
        /// <param name="optionNode">The option node.</param>
        private void ReadFromTable(EntityList list, IDataTable table, LinkedListNode <LoadOptionItem> optionNode)
        {
            var option = optionNode.Value;

            list.ReadFromTable(table, (entity, subTable) =>
            {
                EntityList listResult = null;

                //是否还有后继需要加载的对象?如果是,则递归调用自己进行子对象的加载。
                var nextNode = optionNode.Next;
                if (nextNode != null)
                {
                    listResult = nextNode.Value.OwnerRepository.NewList();
                    this.ReadFromTable(listResult, subTable, nextNode);
                }
                else
                {
                    listResult = option.PropertyEntityRepository.NewList();
                    listResult.ReadFromTable(subTable);
                }

                //是否需要排序?
                if (listResult.Count > 1 && option.OrderBy != null)
                {
                    listResult = option.PropertyEntityRepository.NewListOrderBy(listResult, option.OrderBy);
                }

                //当前对象是加载类型的子对象还是引用的外键
                if (option.LoadType == AggregateLoadType.Children)
                {
                    listResult.SetParentEntity(entity);
                    entity.LoadProperty(option.PropertyMeta.ManagedProperty, listResult);
                }
                else
                {
                    if (listResult.Count > 0)
                    {
                        option.SetReferenceEntity(entity, listResult[0]);
                    }
                }
            });
        }
Esempio n. 2
0
        /// <summary>
        /// 执行懒加载操作。
        /// </summary>
        /// <param name="listProperty">The list property.</param>
        /// <returns></returns>
        private EntityList LoadLazyList(IListProperty listProperty)
        {
            EntityList data = null;

            if (this.FieldExists(listProperty))
            {
                data = this.GetProperty(listProperty) as EntityList;
                if (data != null)
                {
                    return(data);
                }
            }

            if (this.IsNew)
            {
                var listRepository = RepositoryFactoryHost.Factory.FindByEntity(listProperty.ListEntityType);
                data = listRepository.NewList();
            }
            else
            {
                var meta         = listProperty.GetMeta(this) as IListPropertyMetadata;
                var dataProvider = meta.DataProvider;
                if (dataProvider != null)
                {
                    data = dataProvider(this);
                }
                else
                {
                    var listRepository = RepositoryFactoryHost.Factory.FindByEntity(listProperty.ListEntityType) as IRepositoryInternal;
                    data = listRepository.GetLazyListByParent(this);
                    data.SetParentEntity(this);
                }
            }

            this.LoadProperty(listProperty, data);

            return(data);
        }