Esempio n. 1
0
        protected virtual Expression <Func <TEntity, bool> > GetEntitySearchQueryExpressionByFilterQueryRequest <TEntity>(FilterQueryRequest filterQuery)
        {
            if (filterQuery.EmptyQuery)
            {
                return(null);
            }

            Type entityType      = typeof(TEntity);
            var  expressionsList = new List <Expression <Func <TEntity, bool> > >();

            if (filterQuery.FilterQueryStringItems != null && filterQuery.FilterQueryStringItems.Count > 0)
            {
                var expressionFactories = new ExpressionFactories();
                foreach (var queryStringItem in filterQuery.FilterQueryStringItems)
                {
                    Expression <Func <TEntity, bool> > currentExpression = expressionFactories[queryStringItem.EqualityType].BuildExpressionByQueryStringItem <TEntity>(queryStringItem);
                    if (currentExpression != null)
                    {
                        expressionsList.Add(currentExpression);
                    }
                }
            }

            var resultExpression = expressionsList.FirstOrDefault();

            for (int i = 1; i < expressionsList.Count; i++)
            {
                resultExpression = ExpressionFunctions.AndAlso <TEntity>(resultExpression, expressionsList[i]);
            }

            return(resultExpression);
        }
Esempio n. 2
0
        public async Task <PaginatedEntitiesResult <TEntityDto> > FilterEntitiesAsync <TEntity, TEntityDto>(FilterQueryRequest filterQuery)
            where TEntity : class, IEntityBase, new()
        {
            PaginatedEntitiesResult <TEntityDto> result = new PaginatedEntitiesResult <TEntityDto>();

            try
            {
                Expression <Func <TEntity, bool> > searchQueryExpression = null;
                if (filterQuery.FilterQueryStringItems != null && filterQuery.FilterQueryStringItems.Count > 0)
                {
                    searchQueryExpression = GetEntitySearchQueryExpressionByFilterQueryRequest <TEntity>(filterQuery);
                }
                else if (!string.IsNullOrEmpty(filterQuery.SearchQuery))
                {
                    searchQueryExpression = GetEntitySearchQueryExpression <TEntity>(filterQuery.SearchQuery);
                }

                var orderExpression        = GetOrderExpressionByFilterQueryRequest <TEntity>(filterQuery);
                var firstLevelIncludeQuery = GetFirstLevelIncludeQuery <TEntity>();

                if (searchQueryExpression != null)
                {
                    result.Count = (await standardRepository.GetAllAsync <TEntity>()).Count();
                }
                else
                {
                    result.Count = (await standardRepository.QueryAsync <TEntity>(searchQueryExpression)).Count();
                }

                result.CurrentPage = filterQuery.Page.HasValue ? filterQuery.Page.Value : 1;
                if (filterQuery.Page.HasValue)
                {
                    result.PageSize = filterQuery.PageSize.HasValue ? filterQuery.PageSize.Value : PaginationPageSize;
                }
                else
                {
                    result.PageSize = result.Count;
                }

                IEnumerable <TEntity> entities = null;

                if (searchQueryExpression != null)
                {
                    entities = await this.standardRepository.QueryPageAsync <TEntity>(result.StartRow, result.PageSize, searchQueryExpression, orderExpression, firstLevelIncludeQuery);
                }
                else
                {
                    entities = await this.standardRepository.GetPageAsync <TEntity>(result.StartRow, result.PageSize, orderExpression, firstLevelIncludeQuery);
                }

                result.Entities = this.mapper.Map <IEnumerable <TEntityDto> >(entities);
            }
            catch (Exception ex)
            {
                await LogErrorAsync(ex, nameof(FilterEntitiesAsync));
            }

            return(result);
        }
Esempio n. 3
0
        private Func <IQueryable <TEntity>, IOrderedQueryable <TEntity> > GetOrderExpressionByFilterQueryRequest <TEntity>(FilterQueryRequest filterQuery)
        {
            if (string.IsNullOrEmpty(filterQuery.OrderBy) || filterQuery.FilterQueryOrderItems == null || filterQuery.FilterQueryOrderItems.Count == 0)
            {
                return(null);
            }

            Func <IQueryable <TEntity>, IOrderedQueryable <TEntity> > function = (x) =>
            {
                IOrderedQueryable <TEntity> mainOrderFunction = null;
                foreach (var orderItem in filterQuery.FilterQueryOrderItems)
                {
                    if (mainOrderFunction != null)
                    {
                        if (orderItem.OrderType == FilterOrderType.Ascending)
                        {
                            mainOrderFunction = mainOrderFunction.ThenBy(y => y.GetType().GetProperty(orderItem.PropertyName).GetValue(y));
                        }
                        else
                        {
                            mainOrderFunction = mainOrderFunction.ThenByDescending(y => y.GetType().GetProperty(orderItem.PropertyName).GetValue(y));
                        }
                    }
                    else
                    {
                        if (orderItem.OrderType == FilterOrderType.Ascending)
                        {
                            mainOrderFunction = x.OrderBy(y => y.GetType().GetProperty(orderItem.PropertyName).GetValue(y));
                        }
                        else
                        {
                            mainOrderFunction = x.OrderByDescending(y => y.GetType().GetProperty(orderItem.PropertyName).GetValue(y));
                        }
                    }
                }

                return(mainOrderFunction);
            };

            return(function);
        }
Esempio n. 4
0
        public virtual async Task <ActionResult <PaginatedEntitiesResult <TEntityDto> > > Filter(FilterQueryRequest filterQueryRequest)
        {
            if (!this.HasFilter)
            {
                return(this.NotFound());
            }

            if (filterQueryRequest == null || filterQueryRequest.EmptyQuery)
            {
                return(this.RedirectToAction(nameof(this.GetAll)));
            }

            var result = await this.entityManager.FilterEntitiesAsync <TEntity, TEntityDto>(filterQueryRequest);

            return(this.Ok(result));
        }