Ejemplo n.º 1
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            try
            {
                JObject jObject = JObject.Load(reader);
                FilterParameterCollection result = null;
                IFilterOperatorResolver   opres  = null;
                IFilterSortPropResolver   props  = null;

                foreach (var prop in jObject.Properties())
                {
                    if (prop.Name == "params")
                    {
                        var st = new JsonSerializerSettings();
                        st.Converters.Add(new FilterParameterJsonConverter());
                        result = JsonConvert.DeserializeObject <FilterParameterCollection>((string)prop.Value, st);
                    }
                    else if (prop.Name == typeof(IFilterOperatorResolver).Name)
                    {
                        Type opresType = Type.GetType((string)prop.Value);
                        opres = Activator.CreateInstance(opresType) as IFilterOperatorResolver;
                    }
                    else if (prop.Name == typeof(IFilterSortPropResolver).Name)
                    {
                        Type propsType = Type.GetType((string)prop.Value);
                        props = Activator.CreateInstance(propsType) as IFilterSortPropResolver;
                    }
                }

                if (result != null)
                {
                    if (opres != null)
                    {
                        result.OperatorActionResolver = opres;
                    }
                    if (props != null)
                    {
                        result.PropertyNameResolver = props;
                    }
                }

                return(result);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Ejemplo n.º 2
0
        public override Expression <Func <T, bool> > GetLinqCondition <T>(IFilterSortPropResolver propResolver, IFilterOperatorResolver opResolver)
        {
            Expression          body       = null;
            ParameterExpression mainObject = Expression.Parameter(typeof(T), "obj");

            foreach (FilterParameter p in this)
            {
                if (p.Value == null)
                {
                    continue;
                }

                Expression value = Expression.Constant(p.Value, p.Value.GetType());

                Expression propVal = mainObject;
                Type       objType = typeof(T);

                IEnumerable <LambdaExpression> exprList = null;
                if (propResolver != null)
                {
                    exprList = propResolver.FindResolution(_modelType ?? objType, objType, ListControlActionType.Filtering, p.ColumnName);
                }

                if (exprList != null && exprList.Count() > 0)
                {
                    var modifier = new MainObjectLinkModifier(mainObject);
                    propVal = modifier.Visit(exprList.ElementAt(0).Body);
                }
                else
                {
                    string[] propTree = p.ColumnName.Split('.');
                    foreach (string prop in propTree)
                    {
                        PropertyInfo pi = objType.GetProperty(prop, BindingFlags.Instance | BindingFlags.Public);
                        if (pi != null)
                        {
                            propVal = Expression.Property(propVal, pi);
                            objType = pi.PropertyType;
                        }
                    }
                }

                Expression boolOperation = null;
                if (opResolver != null)
                {
                    boolOperation = opResolver.FindResolution(p.Operator, propVal, value);
                }

                if (boolOperation != null)
                {
                    if (body == null)
                    {
                        body = boolOperation;
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(p.OrGroupName) == false)
                        {
                            body = Expression.Or(body, boolOperation);
                        }
                        else
                        {
                            body = Expression.And(body, boolOperation);
                        }
                    }
                }
            }

            if (body == null)
            {
                body = Expression.Equal(Expression.Constant(1), Expression.Constant(1));
            }
            else
            {
                var modifier = new ConstantModifier();
                if (opResolver != null)
                {
                    modifier.StayConstants = opResolver.GetStayConstants();
                }
                body = modifier.Visit(body);
            }

            Expression <Func <T, bool> > res = Expression.Lambda <Func <T, bool> >(body, mainObject);

            return(res);
        }
Ejemplo n.º 3
0
 public abstract Expression <Func <T, bool> > GetLinqCondition <T>(IFilterSortPropResolver propResolver, IFilterOperatorResolver opResolver) where T : class, new();
Ejemplo n.º 4
0
        public static IEnumerable <T> Filtering <T>(this IEnumerable <T> list, FilterParameterCollection filters, IFilterSortPropResolver propResolver, IFilterOperatorResolver opResolver) where T : class, new()
        {
            if (filters != null)
            {
                return(list.Where(filters.GetLinqCondition <T>(propResolver, opResolver).Compile()));
            }

            return(list);
        }
Ejemplo n.º 5
0
 private static object InvokeSortParameterOnEnumerableNext <T>(object sourceList, SortParameter par, IFilterSortPropResolver propResolver) where T : class, new()
 {
     return(InvokeSortParameterOnEnumerable <T>(sourceList, par, propResolver, "ThenBy", "ThenByDescending"));
 }
Ejemplo n.º 6
0
        private static object InvokeSortParameterOnQueryable <T>(object sourceList, SortParameter par, IFilterSortPropResolver propResolver, string ascMethodName, string descMethodName)
            where T : class, new()
        {
            bool isFirst = true;

            foreach (var expr in GetExpressionList <T>(par, propResolver))
            {
                if (isFirst)
                {
                    sourceList = InvokeSortParameterOnQueryable <T>(sourceList, expr, par.SortDirection, ascMethodName, descMethodName);
                    isFirst    = false;
                }
                else
                {
                    sourceList = InvokeSortParameterOnQueryable <T>(sourceList, expr, par.SortDirection, "ThenBy", "ThenByDescending");
                }
            }

            return(sourceList);
        }
Ejemplo n.º 7
0
        private static IEnumerable <LambdaExpression> GetExpressionList <T>(SortParameter par, IFilterSortPropResolver propResolver) where T : class, new()
        {
            IEnumerable <LambdaExpression> exprList = null;

            if (propResolver != null)
            {
                exprList = propResolver.FindResolution(par.Type ?? typeof(T), typeof(T), ListControlActionType.Sorting, par.ColumnName);
            }

            if (exprList == null || exprList.Count() == 0)
            {
                exprList = new LambdaExpression[] { par.GetLinqSortExpr <T>() };
            }

            return(exprList);
        }
Ejemplo n.º 8
0
 public static IOrderedQueryable <T> Sorting <T>(this IOrderedQueryable <T> list, SortParameterCollection sc, IFilterSortPropResolver propResolver) where T : class, new()
 {
     return(Sorting <T>(list, sc, propResolver, false));
 }
Ejemplo n.º 9
0
        public static IOrderedQueryable <T> Sorting <T>(this IQueryable <T> list, SortParameterCollection sc, IFilterSortPropResolver propResolver) where T : class, new()
        {
            foreach (var par in sc)
            {
                return(((IOrderedQueryable <T>)InvokeSortParameterOnQueryableFirst <T>(list, par, propResolver)).Sorting(sc, propResolver, true));
            }

            if (sc.DefaultOrder != null)
            {
                foreach (var par in sc.DefaultOrder)
                {
                    return(((IOrderedQueryable <T>)InvokeSortParameterOnQueryableFirst <T>(list, par, propResolver)).Sorting(sc.DefaultOrder, propResolver, true));
                }
            }

            return(list.OrderBy <T, int>(m => 1));
        }
Ejemplo n.º 10
0
        private static IOrderedQueryable <T> Sorting <T>(this IOrderedQueryable <T> list, SortParameterCollection sc, IFilterSortPropResolver propResolver, bool skipFirst) where T : class, new()
        {
            IOrderedQueryable <T> result = list;

            foreach (var par in sc.Skip(skipFirst ? 1 : 0))
            {
                result = (IOrderedQueryable <T>)InvokeSortParameterOnQueryableNext <T>(result, par, propResolver);
            }

            if (sc.DefaultOrder != null)
            {
                foreach (var par in sc.DefaultOrder)
                {
                    if (sc.Any(p => p.Type == typeof(T) && p.ColumnName == par.ColumnName) == false)
                    {
                        result = (IOrderedQueryable <T>)InvokeSortParameterOnQueryableNext <T>(result, par, propResolver);
                    }
                }
            }

            return(result);
        }
Ejemplo n.º 11
0
 private static object InvokeSortParameterOnQueryableFirst <T>(object sourceList, SortParameter par, IFilterSortPropResolver propResolver) where T : class, new()
 {
     return(InvokeSortParameterOnQueryable <T>(sourceList, par, propResolver, "OrderBy", "OrderByDescending"));
 }