예제 #1
0
        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));
        }
예제 #2
0
        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);
        }