public AutoQueryHandler(IQueryStringAccessor queryStringAccessor, ICriteriaFilterManager criteriaFilterManager, IClauseMapManager clauseMapManager, IClauseValueManager clauseValueManager) { _queryStringAccessor = queryStringAccessor; _criteriaFilterManager = criteriaFilterManager; _clauseMapManager = clauseMapManager; _clauseValueManager = clauseValueManager; }
public AutoQueryHandler(IQueryStringAccessor queryStringAccessor, ICriteriaFilterManager criteriaFilterManager, IClauseMapManager clauseMapManager, IClauseValueManager clauseValueManager, IAutoQueryableProfile profile) { _queryStringAccessor = queryStringAccessor; _criteriaFilterManager = criteriaFilterManager; _clauseMapManager = clauseMapManager; _clauseValueManager = clauseValueManager; _profile = profile; }
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; }
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))); }
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); }
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))); }
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)); }
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); }