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