public AutoQueryHandler(IQueryStringAccessor queryStringAccessor, ICriteriaFilterManager criteriaFilterManager, IClauseMapManager clauseMapManager, IClauseValueManager clauseValueManager)
 {
     _queryStringAccessor   = queryStringAccessor;
     _criteriaFilterManager = criteriaFilterManager;
     _clauseMapManager      = clauseMapManager;
     _clauseValueManager    = clauseValueManager;
 }
Esempio n. 2
0
 public AutoQueryHandler(IQueryStringAccessor queryStringAccessor, ICriteriaFilterManager criteriaFilterManager, IClauseMapManager clauseMapManager, IClauseValueManager clauseValueManager, IAutoQueryableProfile profile)
 {
     _queryStringAccessor   = queryStringAccessor;
     _criteriaFilterManager = criteriaFilterManager;
     _clauseMapManager      = clauseMapManager;
     _clauseValueManager    = clauseValueManager;
     _profile = profile;
 }
Esempio n. 3
0
 public AutoQueryHandler(IQueryStringAccessor queryStringAccessor, ICriteriaFilterManager criteriaFilterManager, IClauseMapManager clauseMapManager, IClauseValueManager clauseValueManager, IAutoQueryableProfile profile,
                         StaticMappingDescription staticMappingDescription = null)
 {
     _queryStringAccessor   = queryStringAccessor;
     _criteriaFilterManager = criteriaFilterManager;
     _clauseMapManager      = clauseMapManager;
     _clauseValueManager    = clauseValueManager;
     _profile = profile;
     _staticMappingDescription = staticMappingDescription;
 }
Esempio n. 4
0
        private static IQueryable <T> _addCriterias <T>(ICriteriaFilterManager criteriaFilterManager, IQueryable <T> source, IEnumerable <Criteria> criterias) where T : class
        {
            var        parentEntity    = Expression.Parameter(typeof(T), "x");
            Expression whereExpression = null;

            foreach (var c in criterias)
            {
                var expression = BuildWhereExpression(criteriaFilterManager, parentEntity, c, c.ColumnPath.ToArray());

                whereExpression = whereExpression == null ? expression : Expression.AndAlso(whereExpression, expression);
            }

            return(source.Where(Expression.Lambda <Func <T, bool> >(whereExpression, parentEntity)));
        }
Esempio n. 5
0
        private static Expression BuildWhereExpression(ICriteriaFilterManager criteriaFilterManager, Expression parameter, Criteria criteria, params string[] properties)
        {
            Type childType = null;

            if (properties.Length > 1)
            {
                //build path
                parameter = Expression.Property(parameter, properties[0]);
                var isCollection = parameter.Type.GetInterfaces().Any(x => x.Name == "IEnumerable");
                //if it´s a collection we later need to use the predicate in the methodexpressioncall
                Expression childParameter;
                if (isCollection)
                {
                    childType      = parameter.Type.GetGenericArguments()[0];
                    childParameter = Expression.Parameter(childType, childType.Name);
                }
                else
                {
                    childParameter = parameter;
                }
                //skip current property and get navigation property expression recursivly
                var innerProperties = properties.Skip(1).ToArray();
                var predicate       = BuildWhereExpression(criteriaFilterManager, childParameter, criteria, innerProperties);
                if (isCollection)
                {
                    //build subquery
                    predicate = BuildWhereSubQueryExpression(parameter, childParameter, childType, predicate);
                }

                return(predicate);
            }
            //build final predicate
            var        childProperty    = parameter.Type.GetProperty(properties[0]);
            var        memberExpression = Expression.Property(parameter, childProperty);
            Expression orExpression     = null;

            foreach (var value in criteria.Values)
            {
                var convertedValue     = ConvertHelper.Convert(value, childProperty.PropertyType, criteria.Filter.FormatProvider);
                ConstantExpression val = Expression.Constant(convertedValue, childProperty.PropertyType);

                var filter = criteriaFilterManager.GetTypeFilter(childProperty.PropertyType, criteria.Filter.Alias);
                if (filter != null)
                {
                    var newExpression = filter.Filter(memberExpression, val);
                    orExpression = orExpression == null ? newExpression : Expression.OrElse(orExpression, newExpression);
                }
            }
            return(orExpression);
        }
Esempio n. 6
0
        private static IQueryable <T> _addCriterias <T>(ICriteriaFilterManager criteriaFilterManager, IQueryable <T> source, IEnumerable <Criteria> criterias) where T : class
        {
            var        parentEntity    = Expression.Parameter(typeof(T), "x");
            Expression whereExpression = null;

            foreach (var c in criterias)
            {
                if (c.Criterias != null && c.Criterias.Count > 0)
                {
                    if (c.Criterias.Count == 1)
                    {
                        var expression = BuildWhereExpression(criteriaFilterManager, parentEntity, c.Criterias.First(), c.Criterias.First().ColumnPath.ToArray());
                        whereExpression = whereExpression == null ? expression : Expression.AndAlso(whereExpression, expression);
                    }

                    List <Expression> expressions = new List <Expression>();
                    foreach (var criteria in c.Criterias)
                    {
                        expressions.Add(BuildWhereExpression(criteriaFilterManager, parentEntity, criteria, criteria.ColumnPath.ToArray()));
                    }
                    Expression currentExpression = null;
                    foreach (var expression in expressions)
                    {
                        if (currentExpression == null)
                        {
                            currentExpression = expression;
                            continue;
                        }
                        currentExpression = Expression.OrElse(expression, currentExpression);
                    }

                    whereExpression = whereExpression == null ? currentExpression : Expression.AndAlso(whereExpression, currentExpression); // TODO
                }
                else
                {
                    var expression = BuildWhereExpression(criteriaFilterManager, parentEntity, c, c.ColumnPath.ToArray());
                    whereExpression = whereExpression == null ? expression : Expression.AndAlso(whereExpression, expression);
                }
            }

            return(source.Where(Expression.Lambda <Func <T, bool> >(whereExpression, parentEntity)));
        }
Esempio n. 7
0
        public static dynamic Build <T>(IClauseValueManager clauseValueManager, ICriteriaFilterManager criteriaFilterManager, IQueryable <T> query, ICollection <Criteria> criterias, IAutoQueryableProfile profile) where T : class
        {
            if (criterias != null && criterias.Any())
            {
                query = _addCriterias(criteriaFilterManager, query, criterias);
            }
            query = _addOrderBy(query, clauseValueManager.OrderBy, profile);

            TotalCountQuery = query;
            if (clauseValueManager.First)
            {
                return(query.FirstOrDefault());
            }
            if (clauseValueManager.Last)
            {
                return(query.LastOrDefault());
            }
            query = _handlePaging(clauseValueManager, query, profile);
            //if (profile?.MaxToTake != null)
            //{
            //    queryProjection = profile.UseBaseType ? ((IQueryable<T>)queryProjection).Take(profile.MaxToTake.Value) : queryProjection.Take(profile.MaxToTake.Value);
            //}

            IQueryable <dynamic> queryProjection = query;

            if (clauseValueManager.Select.Any() || profile?.UnselectableProperties != null || profile?.SelectableProperties != null)
            {
                if (profile != null)
                {
                    if (profile.ToListBeforeSelect)
                    {
                        query = query.ToList().AsQueryable();
                    }
                    queryProjection = profile.UseBaseType ?
                                      query.Select(SelectHelper.GetSelector <T, T>(clauseValueManager.Select, profile)) : query.Select(SelectHelper.GetSelector <T, object>(clauseValueManager.Select, profile));
                }
            }

            return(queryProjection.HandleWrapping(clauseValueManager));
        }
Esempio n. 8
0
        public static IQueryable <T> AddCriterias <T>(IQueryable <T> query, ICollection <Criteria> criterias, ICriteriaFilterManager criteriaFilterManager) where T : class
        {
            if (criterias != null && criterias.Any())
            {
                return(_addCriterias(criteriaFilterManager, query, criterias));
            }

            return(query);
        }