Ejemplo n.º 1
0
        /// <summary>
        /// 查询指定实体的孩子。
        /// </summary>
        /// <param name="entity">当前实体。</param>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数。</param>
        /// <param name="recurrence">是否递归出所有孩子。</param>
        /// <returns></returns>
        public virtual IQueryable <TEntity> QueryChildren(TEntity entity, Expression <Func <TEntity, bool> > predicate = null, bool recurrence = false)
        {
            var expression = TreeExpressionBuilder.BuildQueryChildrenExpression(metaTree, entity, predicate, recurrence);

            var querable = QueryHelper.CreateQuery <TEntity>(repository.Provider, expression);

            var orderExp = TreeExpressionBuilder.BuildOrderByExpression <TEntity>(metaTree, querable.Expression);

            return(repository.Provider.CreateQuery <TEntity>(orderExp));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 获取孩子、孙子、重孙...。
        /// </summary>
        /// <param name="argument"></param>
        /// <param name="isolation"></param>
        /// <returns></returns>
        private IEnumerable <TEntity> GetChildren(EntityTreeUpfydatingArgument argument, Expression <Func <TEntity> > isolation = null)
        {
            var expression = TreeExpressionBuilder.BuildGetChildrenExpression <TEntity>(metaTree, argument.OldValue.InnerId);

            var querable = QueryHelper.CreateQuery <TEntity>(repository.Provider, expression);

            expression = TreeExpressionBuilder.AddIsolationExpression <TEntity>(querable.Expression, isolation);
            expression = TreeExpressionBuilder.AddUseableSelectExpression <TEntity>(metaTree, expression);

            return(repository.Provider.CreateQuery <TEntity>(expression).ToList());
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 判断实体是否具有孩子。
        /// </summary>
        /// <param name="entity">当前实体。</param>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数。</param>
        /// <returns></returns>
        public virtual bool HasChildren(TEntity entity, Expression <Func <TEntity, bool> > predicate = null)
        {
            var query    = (IQueryable)QueryHelper.CreateQuery <TEntity>(repository.Provider, predicate);
            var mthCount = typeof(Enumerable).GetMethods().FirstOrDefault(s => s.Name == "Count" && s.GetParameters().Length == 2);

            mthCount = mthCount.MakeGenericMethod(typeof(TEntity));

            var expression = TreeExpressionBuilder.BuildHasChildrenExpression(metaTree, entity, predicate);

            expression = Expression.Call(null, mthCount, query.Expression, expression);
            return((int)repository.Provider.Execute(expression) > 0);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 异步的,判断实体是否具有孩子。
        /// </summary>
        /// <param name="entity">当前实体。</param>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数。</param>
        /// <param name="cancellationToken">取消操作的通知。</param>
        /// <returns></returns>
        public virtual async Task <bool> HasChildrenAsync(TEntity entity, Expression <Func <TEntity, bool> > predicate = null, CancellationToken cancellationToken = default)
        {
            var query    = (IQueryable)QueryHelper.CreateQuery <TEntity>(repository.Provider, predicate);
            var mthCount = typeof(Enumerable).GetMethods().FirstOrDefault(s => s.Name == "Count" && s.GetParameters().Length == 2);

            mthCount = mthCount.MakeGenericMethod(typeof(TEntity));

            var expression = TreeExpressionBuilder.BuildHasChildrenExpression(metaTree, entity, predicate);

            expression = Expression.Call(null, mthCount, query.Expression, expression);
            return(await((IAsyncQueryProvider)repository.Provider).ExecuteAsync <int>(expression, cancellationToken) > 0);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 递归返回实体的父亲实体。
        /// </summary>
        /// <param name="entity">当前实体。</param>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数。</param>
        /// <returns></returns>
        public IQueryable <TEntity> RecurrenceParent(TEntity entity, Expression <Func <TEntity, bool> > predicate = null)
        {
            Guard.ArgumentNull(entity, nameof(entity));

            var keyId = (string)entity.GetValue(metaTree.InnerSign);

            var parents = new List <string>();

            while ((keyId = keyId.Substring(0, keyId.Length - metaTree.SignLength)).Length > 0)
            {
                parents.Add(keyId);
            }

            var expression = TreeExpressionBuilder.BuildGetByInnerIdExpression <TEntity>(metaTree, predicate, parents);

            var querable = QueryHelper.CreateQuery <TEntity>(repository.Provider, expression);

            var orderExp = TreeExpressionBuilder.BuildOrderByLengthDescExpression <TEntity>(metaTree, querable.Expression);

            return(repository.Provider.CreateQuery <TEntity>(orderExp));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 查询指定实体的孩子。
        /// </summary>
        /// <param name="entity">当前实体。</param>
        /// <param name="predicate">用于测试每个元素是否满足条件的函数。</param>
        /// <param name="recurrence">是否递归出所有孩子。</param>
        /// <returns></returns>
        public virtual IQueryable <TEntity> QueryChildren(TEntity entity, Expression <Func <TEntity, bool> > predicate = null, bool recurrence = false)
        {
            var expression = TreeExpressionBuilder.BuildQueryChildrenExpression <TEntity>(GetMetadata(), entity, predicate, recurrence);

            return(QueryHelper.CreateQuery <TEntity>(Provider, expression));
        }