Beispiel #1
0
        public static QueryResult Build <T>(IQueryable <T> query, Type entityType, IList <Clause> clauses, IList <Criteria> criterias, string[] unselectableProperties, bool countAllRows) where T : class
        {
            Clause selectClause      = clauses.FirstOrDefault(c => c.ClauseType == ClauseType.Select);
            Clause topClause         = clauses.FirstOrDefault(c => c.ClauseType == ClauseType.Top);
            Clause skipClause        = clauses.FirstOrDefault(c => c.ClauseType == ClauseType.Skip);
            Clause firstClause       = clauses.FirstOrDefault(c => c.ClauseType == ClauseType.First);
            Clause lastClause        = clauses.FirstOrDefault(c => c.ClauseType == ClauseType.Last);
            Clause orderByClause     = clauses.FirstOrDefault(c => c.ClauseType == ClauseType.OrderBy);
            Clause orderByDescClause = clauses.FirstOrDefault(c => c.ClauseType == ClauseType.OrderByDesc);
            Clause includeClause     = clauses.FirstOrDefault(c => c.ClauseType == ClauseType.Include);

            List <string>        selectColumns    = SelectHelper.GetSelectableColumns(selectClause, unselectableProperties, entityType).ToList();
            IEnumerable <Column> orderColumns     = OrderByHelper.GetOrderByColumns(orderByClause, unselectableProperties, entityType);
            IEnumerable <Column> orderDescColumns = OrderByHelper.GetOrderByColumns(orderByDescClause, unselectableProperties, entityType);

            if (criterias.Any())
            {
                query = query.Where(criterias);
            }
            var totalCount = 0;

            if (countAllRows)
            {
                totalCount = query.Count();
            }
            if (orderColumns != null)
            {
                query = query.OrderBy(orderColumns);
            }
            else if (orderDescColumns != null)
            {
                query = query.OrderByDesc(orderDescColumns);
            }

            if (includeClause != null)
            {
                List <string> includeColumns = IncludeHelper.GetIncludableColumns(includeClause, unselectableProperties, entityType).ToList();
                foreach (string column in includeColumns)
                {
                    query = query.Include(column);
                }
            }

            IQueryable <object> queryProjection;

            if (selectClause == null && unselectableProperties == null)
            {
                queryProjection = query;
            }
            else
            {
                queryProjection = query.Select(SelectHelper.GetSelector <T>(string.Join(",", selectColumns)));
            }

            if (skipClause != null)
            {
                int skip;
                int.TryParse(skipClause.Value, out skip);
                queryProjection = queryProjection.Skip(skip);
            }
            if (topClause != null)
            {
                int take;
                int.TryParse(topClause.Value, out take);
                queryProjection = queryProjection.Take(take);
            }
            else if (firstClause != null)
            {
                return(new QueryResult {
                    Result = queryProjection.FirstOrDefault(), TotalCount = totalCount
                });
            }
            else if (lastClause != null)
            {
                return(new QueryResult {
                    Result = queryProjection.LastOrDefault(), TotalCount = totalCount
                });
            }
            return(new QueryResult {
                Result = queryProjection, TotalCount = totalCount
            });
        }
        public static QueryResult Build <T>(IQueryable <T> query, Type entityType, Clauses clauses, IList <Criteria> criterias, AutoQueryableProfile profile, bool countAllRows) where T : class
        {
            IColumnProvider            columnProvider = ProviderFactory.GetColumnProvider(profile?.ProviderType);
            IEnumerable <SelectColumn> selectColumns  = columnProvider.GetSelectableColumns(clauses, profile, entityType);

            IEnumerable <Column> orderColumns     = OrderByHelper.GetOrderByColumns(profile, clauses.OrderBy, entityType);
            IEnumerable <Column> orderDescColumns = OrderByHelper.GetOrderByColumns(profile, clauses.OrderByDesc, entityType);

            if (criterias != null && criterias.Any())
            {
                query = query.Where(criterias);
            }
            var totalCount = 0;

            if (countAllRows)
            {
                totalCount = query.Count();
            }
            if (orderColumns != null)
            {
                query = query.OrderBy(orderColumns);
            }
            else if (orderDescColumns != null)
            {
                query = query.OrderByDesc(orderDescColumns);
            }

            IQueryable <object> queryProjection;

            if (clauses.Select == null && profile?.UnselectableProperties == null && profile?.SelectableProperties == null)
            {
                queryProjection = query;
            }
            else
            {
                if (profile.UseBaseType)
                {
                    queryProjection = query.Select(SelectHelper.GetSelector <T, T>(selectColumns, profile));
                }
                else
                {
                    queryProjection = query.Select(SelectHelper.GetSelector <T, object>(selectColumns, profile));
                }
            }

            if (clauses.Skip != null)
            {
                int.TryParse(clauses.Skip.Value, out int skip);
                if (profile?.MaxToSkip != null && skip > profile.MaxToSkip)
                {
                    skip = profile.MaxToSkip.Value;
                }
                queryProjection = queryProjection.Skip(skip);
            }
            if (clauses.Top != null)
            {
                int.TryParse(clauses.Top.Value, out int take);
                if (profile?.MaxToTake != null && take > profile?.MaxToTake)
                {
                    take = profile.MaxToTake.Value;
                }
                queryProjection = queryProjection.Take(take);
            }
            else if (clauses.First != null)
            {
                return(new QueryResult {
                    Result = queryProjection.FirstOrDefault(), TotalCount = totalCount
                });
            }
            else if (clauses.Last != null)
            {
                return(new QueryResult {
                    Result = queryProjection.LastOrDefault(), TotalCount = totalCount
                });
            }
            else if (profile?.MaxToTake != null)
            {
                queryProjection = queryProjection.Take(profile.MaxToTake.Value);
            }
            return(new QueryResult {
                Result = queryProjection, TotalCount = totalCount
            });
        }