Ejemplo n.º 1
0
        public static Expression <Func <TSource, bool> > GetFilterExpression <TSource, TFilter>(TFilter filter)
        {
            List <ExpressionFilterModel> filters = new List <ExpressionFilterModel>();

            PropertyInfo[] filterProps = typeof(TFilter).GetProperties();
            foreach (PropertyInfo filterProperty in filterProps)
            {
                ExpressionFilterModel expression = new ExpressionFilterModel();
                expression.Comparison = FilterComparison.Equal;
                expression.Value      = filterProperty.GetValue(filter);

                if (expression.Value == null)
                {
                    continue;
                }

                FilterAttribute attribute = (FilterAttribute)filterProperty.GetCustomAttributes(true).Where(x => x.GetType() == typeof(FilterAttribute)).FirstOrDefault();
                if (attribute == null || attribute.FilterComparison == FilterComparison.NoFilter)
                {
                    continue;
                }
                expression.Comparison = attribute.FilterComparison;
                if (attribute.FilterProperty != null)
                {
                    expression.PropertyName = attribute.FilterProperty;
                }
                else
                {
                    expression.PropertyName = filterProperty.Name;
                }
                filters.Add(expression);
            }
            return(ConstructAndExpressionTree <TSource>(filters));
        }
Ejemplo n.º 2
0
        public static Expression GetExpression <T>(ParameterExpression param, ExpressionFilterModel filter)
        {
            if (filter.Value == null)
            {
                return(null);
            }

            Expression member   = Expression.Property(param, filter.PropertyName);
            Expression constant = Expression.Constant(filter.Value);

            if (member.Type.Name.ToLower() != "string")
            {
                FilterForNullableMember(ref member, ref constant);
            }

            BinaryExpression exp  = Expression.NotEqual(member, Expression.Constant(null));
            Expression       next = null;

            switch (filter.Comparison)
            {
            case FilterComparison.Equal:
                next = Expression.Equal(member, constant);
                break;

            case FilterComparison.GreaterThan:
                next = Expression.GreaterThan(member, constant);
                break;

            case FilterComparison.GreaterThanOrEqual:
                next = Expression.GreaterThanOrEqual(member, constant);
                break;

            case FilterComparison.LessThan:
                next = Expression.LessThan(member, constant);
                break;

            case FilterComparison.LessThanOrEqual:
                next = Expression.LessThanOrEqual(member, constant);
                break;

            case FilterComparison.NotEqual:
                next = Expression.NotEqual(member, constant);
                break;

            case FilterComparison.Contains:
                constant = Expression.Constant(((string)filter.Value).ToLower());
                next     = Expression.Call(member, containsMethod, constant);
                break;

            case FilterComparison.StartsWith:
                constant = Expression.Constant(((string)filter.Value).ToLower());
                next     = Expression.Call(member, startsWithMethod, constant);
                break;

            case FilterComparison.EndsWith:
                constant = Expression.Constant(((string)filter.Value).ToLower());
                next     = Expression.Call(member, endsWithMethod, constant);
                break;

            default:
                return(null);
            }
            return(Expression.And(exp, next));
        }