示例#1
0
        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);
        }