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 }); }