예제 #1
0
        public ValueTask <IQueryable> Visit(ExecuteOrderByStage executeOrderByStage)
        {
            Debug.Assert(queryable != null);
            var orderByExecutor = _orderByExecutorFactory.GetOrderByExecutor(executeOrderByStage);

            return(orderByExecutor.Execute(queryable, executeOrderByStage));
        }
예제 #2
0
 public IOrderByExecutor GetOrderByExecutor(ExecuteOrderByStage executeOrderByStage)
 {
     if (!executors.TryGetValue(executeOrderByStage.EntityType, out var executor))
     {
         var t = typeof(DefaultOrderByExecutor <>).MakeGenericType(executeOrderByStage.EntityType);
         executor = (IOrderByExecutor)Activator.CreateInstance(t);
         executors.TryAdd(executeOrderByStage.EntityType, executor);
     }
     return(executor);
 }
예제 #3
0
        public override ValueTask <IQueryable <Entity> > ExecuteOrderBy(IQueryable <Entity> queryable, ExecuteOrderByStage executeOrderByStage)
        {
            var sortItems = executeOrderByStage.SortItems;

            if (sortItems.Count == 0)
            {
                return(new ValueTask <IQueryable <Entity> >(queryable));
            }

            int i = 0;

            var sortItem = sortItems[i];
            var lambda   = GetSortLambda(sortItem, executeOrderByStage.ParameterExpression);

            IOrderedQueryable <Entity> orderedQueryable;

            if (sortItem.Descending)
            {
                orderedQueryable = queryable.OrderByDescending(lambda);
            }
            else
            {
                orderedQueryable = queryable.OrderBy(lambda);
            }
            i++;

            for (; i < sortItems.Count; i++)
            {
                sortItem = sortItems[i];
                lambda   = GetSortLambda(sortItem, executeOrderByStage.ParameterExpression);

                if (sortItem.Descending)
                {
                    orderedQueryable = orderedQueryable.ThenByDescending(lambda);
                }
                else
                {
                    orderedQueryable = orderedQueryable.ThenBy(lambda);
                }
            }
            return(new ValueTask <IQueryable <Entity> >(orderedQueryable));
        }
예제 #4
0
 public abstract ValueTask <IQueryable <Entity> > ExecuteOrderBy(IQueryable <Entity> queryable, ExecuteOrderByStage executeOrderByStage);
예제 #5
0
 public async ValueTask <IQueryable> Execute(IQueryable queryable, ExecuteOrderByStage executeOrderByStage)
 {
     return(await ExecuteOrderBy((IQueryable <Entity>) queryable, executeOrderByStage));
 }