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