public static IQueryable <T> Include <T>(
            this IQueryable <T> queryable, Action <IncludesBuilder <T> > include) where T : class
        {
            var includesBuilder = new IncludesBuilder <T>();

            include(includesBuilder);

            foreach (var propToInclude in includesBuilder.Includes)
            {
                queryable = queryable.Include(propToInclude);
            }

            return(queryable);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Query builder in specified DB context
        /// </summary>
        /// <param name="dbContext"></param>
        /// <param name="predicate"></param>
        /// <param name="includeList"></param>
        /// <param name="orderBys"></param>
        /// <param name="skip"></param>
        /// <param name="take"></param>
        /// <returns></returns>
        private IQueryable <TEntity> Query(
            ApplicationDbContext dbContext,
            Expression <Func <TEntity, bool> > predicate = null,
            IEnumerable <Expression <Func <TEntity, object> > > includeList = null,
            IEnumerable <IOrderBy <TEntity> > orderBys = null,
            int?skip = null,
            int?take = null
            )
        {
            var query = dbContext.Set <TEntity>().AsQueryable();

            if (includeList != null)
            {
                foreach (var expression in includeList)
                {
                    if (IncludesBuilder.TryParsePath(expression.Body, out var path) && !string.IsNullOrEmpty(path))
                    {
                        query = query.Include(path);
                    }
                }
            }

            if (predicate != null)
            {
                query = query.Where(predicate);
            }

            if (orderBys != null)
            {
                var ordered = orderBys.Aggregate <IOrderBy <TEntity>, IOrderedQueryable <TEntity> >(null, (current, orderBy) => current == null ? orderBy.Apply(query) : orderBy.Apply(current));
                query = ordered ?? query;
            }

            if (skip.HasValue)
            {
                query = query.Skip(skip.Value);
            }

            if (take.HasValue)
            {
                query = query.Take(take.Value);
            }

            return(query);
        }