Example #1
0
        private IQueryable <T> ApplySortToQueryable(CosmosListOptions listOptions, IQueryable <T> filteredQueryable)
        {
            string               orderDirection = listOptions.SortDirection == null || listOptions.SortDirection == SortDirection.ASC ? "OrderBy" : "OrderByDescending";
            Type                 type           = typeof(T);
            PropertyInfo         property       = type.GetProperty(listOptions.Sort);
            ParameterExpression  parameter      = Expression.Parameter(type, "p");
            MemberExpression     propertyAccess = Expression.MakeMemberAccess(parameter, property);
            LambdaExpression     orderByExp     = Expression.Lambda(propertyAccess, parameter);
            MethodCallExpression resultExp      = Expression.Call(typeof(Queryable), orderDirection, new Type[] { type, property.PropertyType }, filteredQueryable.Expression, Expression.Quote(orderByExp));

            return(filteredQueryable.Provider.CreateQuery <T>(resultExp));
        }
Example #2
0
        public async Task <CosmosListPage <T> > GetItemsAsync(IQueryable <T> queryable, QueryRequestOptions requestOptions, CosmosListOptions listOptions)
        {
            IQueryable <T> filteredQueryable = queryable;

            if (listOptions.Search != null && listOptions.SearchOn != null)
            {
                filteredQueryable = ApplySearchToQueryable(listOptions.Search, listOptions.SearchOn, filteredQueryable);
            }

            if (listOptions.Filters.Any())
            {
                filteredQueryable = ApplyFiltersToQueryable(listOptions.Filters, filteredQueryable);
            }

            if (listOptions.Sort != null)
            {
                filteredQueryable = ApplySortToQueryable(listOptions, filteredQueryable);
            }

            QueryDefinition queryDefinition = filteredQueryable.ToQueryDefinition();

            FeedIterator <T> queryResultSetIterator = _container.GetItemQueryIterator <T>(queryDefinition, listOptions.ContinuationToken, requestOptions);

            List <T>         results          = new List <T>();
            FeedResponse <T> currentResultSet = await queryResultSetIterator.ReadNextAsync();

            foreach (T document in currentResultSet)
            {
                results.Add(document);
            }

            Response <int> count = await filteredQueryable.CountAsync();

            return(new CosmosListPage <T>()
            {
                Meta = new CosmosMeta()
                {
                    PageSize = (int)requestOptions.MaxItemCount, Total = count.Resource, ContinuationToken = currentResultSet.ContinuationToken
                },
                Items = results
            });
        }