/// <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]); } } }); }
/// <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); }