private IQueryable <Bucket> BuildQuery(Expression <Func <Bucket, bool> > predicate, int?limit, int?offset, Ordering <Bucket>?ordering = null) { if (predicate is null) { throw new ArgumentNullException(nameof(predicate)); } IQueryable <Bucket> query = this.context.Set <Bucket>().Where(predicate); if (ordering != null) { foreach (OrderBy orderBy in ordering) { string methodName = orderBy.Ascending ? nameof(Queryable.ThenBy) : nameof(Queryable.ThenByDescending); if (orderBy == ordering.First()) { methodName = orderBy.Ascending ? nameof(Queryable.OrderBy) : nameof(Queryable.OrderByDescending); } query = query.Provider.CreateQuery <Bucket>(Expression.Call( typeof(Queryable), methodName, new Type[] { typeof(Bucket), KeySelectors[orderBy.PropertyName].ReturnType }, query.Expression, Expression.Quote(KeySelectors[orderBy.PropertyName]))); } } if (offset != null) { query = query.Skip(offset.GetValueOrDefault()); } if (limit != null) { query = query.Take(limit.GetValueOrDefault()); } return(query); }