Example #1
0
        protected void PrepareArgs(EntityQueryArgsBase args)
        {
            if (args.EntityList == null)
            {
                //必须使用 NewListFast,否则使用 NewList 会导致调用了 NotifyLoaded,
                //这样,不但不符合设计(这个列表需要在客户端才调用 NotifyLoaded),还会引发树型实体列表的多次关系重建。
                args.EntityList = Repo.NewListFast();
            }

            args.SetFetchType(CurrentIEQC.FetchType);
        }
Example #2
0
        ///// <summary>
        ///// 所有使用 IQuery 的数据查询,在调用完应 queryBuilder 之后,都会执行此此方法。
        ///// 所以子类可以重写此方法实现统一的查询条件逻辑。
        ///// (例如,对于映射同一张表的几个子类的查询,可以使用此方法统一对所有方法都过滤)。
        /////
        ///// 默认实现为:
        ///// * 如果还没有进行排序,则进行默认的排序。
        ///// * 如果单一参数实现了 IPagingCriteria 接口,则使用其中的分页信息进行分页。
        ///// </summary>
        ///// <param name="args"></param>
        //protected virtual void OnPropertyQuerying(PropertyQueryArgs args)
        //{
        //    //如果没有指定 OrderNo 字段,则按照Id 排序。
        //    if (args.FetchType != FetchType.Count && !args.PropertyQuery.HasOrdered)
        //    {
        //        args.PropertyQuery.OrderBy(Entity.IdProperty, OrderDirection.Ascending);
        //    }

        //    //默认对分页进行处理。
        //    if (args.Filter == null)
        //    {
        //        var pList = CurrentIEQC.Parameters;
        //        if (pList.Length == 1)
        //        {
        //            var userCriteria = pList[0] as IPagingCriteria;
        //            if (userCriteria != null) { args.PropertyQuery.Paging(userCriteria.PagingInfo); }
        //        }
        //    }
        //}

        #endregion

        private void PrepareArgs(EntityQueryArgsBase args)
        {
            if (args.EntityList == null)
            {
                //必须使用 NewListFast,否则使用 NewList 会导致调用了 NotifyLoaded,
                //这样,不但不符合设计(这个列表需要在客户端才调用 NotifyLoaded),还会引发树型实体列表的多次关系重建。
                args.EntityList = (Repo as EntityRepository).NewListFast();
            }

            args.SetQueryType(CurrentIEQC.QueryType);
        }
Example #3
0
        internal void LoadByFilter(EntityQueryArgsBase args)
        {
            var entityList = args.EntityList;
            var filter = args.Filter;

            //如果存储过滤器,则说明 list 是一个内存中的临时对象。这时需要重新把数据加载进 List 中来。
            if (args.QueryType == RepositoryQueryType.Count)
            {
                entityList.SetTotalCount(args.MemoryList.Count(e => filter(e)));
            }
            else
            {
                foreach (var item in args.MemoryList)
                {
                    if (filter(item)) { entityList.Add(item); }
                }
            }
        }
Example #4
0
        /// <summary>
        /// 在数据加载完成后,完成其它的贪婪加载。
        /// </summary>
        /// <param name="args"></param>
        /// <param name="entityList"></param>
        /// <param name="oldCount"></param>
        protected void EagerLoadOnCompleted(EntityQueryArgsBase args, EntityList entityList, int oldCount)
        {
            if (entityList.Count > 0)
            {
                if (args.FetchType == FetchType.First || args.FetchType == FetchType.List)
                {
                    var elOptions = args.EagerLoadOptions;
                    if (elOptions != null)
                    {
                        //先加载树子节点。
                        if (elOptions.LoadTreeChildren)
                        {
                            /*********************** 代码块解释 *********************************
                             * 加载树时,EntityList.LoadAllNodes 方法只加载根节点的子节点。
                             * 如果使用了 GetAll 方法,那么默认是已经加载了子节点的,不需要再调用 EntityList.LoadAllNodes。
                             * 所以下面只能对于每一个节点,
                             **********************************************************************/
                            var tree = entityList as ITreeComponent;
                            if (!tree.IsFullLoaded)
                            {
                                for (int i = 0, c = entityList.Count; i < c; i++)
                                {
                                    var item = entityList[i] as ITreeComponent;
                                    item.LoadAllNodes();
                                }
                            }
                        }

                        //再加载实体的属性。
                        this.EagerLoad(entityList, elOptions.CoreList);
                    }

                    //如果 entityList 列表中已经有数据,那么只能对新添加的实体进行 OnDbLoaded操作通知加载完成。
                    this.OnDbLoaded(entityList, oldCount);
                }
            }

            _dataProvider.OnEntityQueryed(args);
        }
Example #5
0
 /// <summary>
 /// QueryList 方法完成后调用。
 ///
 /// 子类可重写此方法来实现查询完成后的数据修整工具。
 /// </summary>
 /// <param name="args"></param>
 internal protected virtual void OnEntityQueryed(EntityQueryArgsBase args)
 {
 }
Example #6
0
 /// <summary>
 /// QueryList 方法完成后调用。
 ///
 /// 子类可重写此方法来实现查询完成后的数据修整工具。
 /// </summary>
 /// <param name="args"></param>
 internal protected virtual void OnEntityQueryed(EntityQueryArgsBase args)
 {
     _dataQueryer.OnEntityQueryed(args);
 }
        private void PrepareArgs(EntityQueryArgsBase args)
        {
            if (args.EntityList == null)
            {
                //必须使用 NewListFast,否则使用 NewList 会导致调用了 NotifyLoaded,
                //这样,不但不符合设计(这个列表需要在客户端才调用 NotifyLoaded),还会引发树型实体列表的多次关系重建。
                args.EntityList = (Repo as EntityRepository).NewListFast();
            }

            args.SetFetchType(CurrentIEQC.FetchType);
        }
Example #8
0
 /// <summary>
 /// QueryList 方法完成后调用。
 /// 
 /// 子类可重写此方法来实现查询完成后的数据修整工具。
 /// </summary>
 /// <param name="args"></param>
 protected internal virtual void OnEntityQueryed(EntityQueryArgsBase args)
 {
     _dataQueryer.OnEntityQueryed(args);
 }