public static dynamic GetAutoQuery <TEntity>(string queryString, Type entityType, IQueryable <TEntity> query, AutoQueryableProfile profile) where TEntity : class { // If query string empty select default entity properties. if (string.IsNullOrEmpty(queryString)) { IColumnProvider columnProvider = ProviderFactory.GetColumnProvider(); IEnumerable <SelectColumn> selectColumns = EntityColumnHelper.GetSelectableColumns(profile, entityType); if (profile.UseBaseType) { return(query.Select(SelectHelper.GetSelector <TEntity, TEntity>(selectColumns, profile))); } return(query.Select(SelectHelper.GetSelector <TEntity, object>(selectColumns, profile))); } // Get criteria & clauses from choosen provider (AQ, OData, ...) string[] queryStringParts = queryString.GetParts(); ICriteriaProvider criteriaProvider = ProviderFactory.GetCriteriaProvider(profile?.ProviderType); IList <Criteria> criterias = profile.IsClauseAllowed(ClauseType.Filter) ? criteriaProvider.GetCriterias(entityType, queryStringParts, profile).ToList() : null; IClauseProvider clauseProvider = ProviderFactory.GetClauseProvider(profile?.ProviderType); Clauses clauses = clauseProvider.GetClauses(queryStringParts, profile); var countAllRows = false; IEnumerable <WrapperPartType> wrapperParts = null; if (clauses.WrapWith != null) { IWrapperProvider wrapperProvider = ProviderFactory.GetWrapperProvider(); wrapperParts = wrapperProvider.GetWrapperParts(clauses.WrapWith.Value.Split(','), profile).ToList(); countAllRows = wrapperParts.Contains(WrapperPartType.TotalCount); } QueryResult queryResult = QueryBuilder.Build(query, entityType, clauses, criterias, profile, countAllRows); if (clauses.WrapWith == null || !wrapperParts.Any()) { return(queryResult.Result); } return(DefaultWrapperProvider.GetWrappedResult(wrapperParts, queryResult, clauses, queryString)); }
public IEnumerable <SelectColumn> GetSelectableColumns(Clauses clauses, AutoQueryableProfile profile, Type entityType) { List <SelectColumn> selectColumns = new List <SelectColumn>(); // If select clause is null, take all properties. if (clauses.Select == null) { IEnumerable <SelectColumn> entityColumns = EntityColumnHelper.GetSelectableColumns(profile, entityType); selectColumns.AddRange(entityColumns); } else { string[] uriPropertyNames = clauses.Select.Value.Split(','); foreach (string n in uriPropertyNames) { // remove properties who does not exist on the entity type PropertyInfo property = entityType.GetProperties().FirstOrDefault(x => string.Equals(x.Name, n, StringComparison.OrdinalIgnoreCase)); if (property == null) { continue; } // Remove non selectable properties. if (profile?.SelectableProperties != null) { if (!profile.SelectableProperties.Contains(n, StringComparer.OrdinalIgnoreCase)) { continue; } } // Remove unselectable properties. if (profile?.UnselectableProperties != null) { if (profile.UnselectableProperties.Contains(n, StringComparer.OrdinalIgnoreCase)) { continue; } } selectColumns.Add(new SelectColumn { Key = n, Name = n, Type = property.PropertyType }); } } // Nothing to expand, return values directly. if (clauses.Expand == null) { //foreach (string s in clauses.Expand.Value.Split(',')) //{ // PropertyInfo property = entityType.GetProperties().FirstOrDefault(x => string.Equals(x.Name, s, StringComparison.OrdinalIgnoreCase)); // if (property == null) continue; // selectColumns.Add(new SelectColumn // { // Key = s, // Name = s, // Type = property.PropertyType // }); //} return(selectColumns); } return(selectColumns); }