public Predicate(PredicateExpressionType expressionType, string expressionProperty,
                  PredicateConnectorType predicateConnectorType = PredicateConnectorType.And)
 {
     ExpressionType         = expressionType;
     ExpressionProperty     = expressionProperty;
     PredicateConnectorType = predicateConnectorType;
 }
Exemple #2
0
        private static Expression BuildIntContainsCondition(Expression parameterExpression,
                                                            PredicateExpressionType comparer, Expression valueExpression)
        {
            var contains = valueExpression.Type.GetMethod(Enum.GetName(typeof(PredicateExpressionType), comparer));

            if (contains == null)
            {
                throw new NullReferenceException();
            }
            //Backwards left/right for int contains
            return(Expression.Call(valueExpression, contains, parameterExpression));
        }
Exemple #3
0
        private static Expression BuildExpression(Expression parameterExpression, PredicateExpressionType comparer,
                                                  Expression valueExpression)
        {
            if ((comparer == PredicateExpressionType.StartsWith || comparer == PredicateExpressionType.EndsWith) &&
                parameterExpression.Type != typeof(string))
            {
                comparer = PredicateExpressionType.Equals;
            }
            switch (comparer)
            {
            case PredicateExpressionType.Contains
                when valueExpression.Type == typeof(List <int>) || valueExpression.Type == typeof(List <int?>):
                return(BuildIntContainsCondition(parameterExpression, comparer, valueExpression));

            case PredicateExpressionType.Contains
                when valueExpression.Type == typeof(string):
                return(BuildStringContainsCondition(parameterExpression, comparer, valueExpression));

            case PredicateExpressionType.StartsWith when valueExpression.Type == typeof(string):
                return(BuildStringCondition(parameterExpression, comparer, valueExpression));

            case PredicateExpressionType.EndsWith when valueExpression.Type == typeof(string):
                return(BuildStringCondition(parameterExpression, comparer, valueExpression));

            case PredicateExpressionType.Equals:
                break;

            case PredicateExpressionType.GreaterThan:
                break;

            case PredicateExpressionType.GreaterThanOrEqual:
                break;

            case PredicateExpressionType.LessThan:
                break;

            case PredicateExpressionType.LessThanOrEqual:
                break;

            case PredicateExpressionType.NotEqual:
                break;

            default:
                return(Expression.MakeBinary((ExpressionType)comparer, parameterExpression, Expression.Convert(valueExpression, parameterExpression.Type)));
            }
            return(Expression.MakeBinary((ExpressionType)comparer, parameterExpression, Expression.Convert(valueExpression, parameterExpression.Type)));
        }
Exemple #4
0
        private static Expression BuildCondition(Expression parameter, PredicateExpressionType comparer, object value, params string[] properties)
        {
            Expression parameterExpression;
            Type       childType = null;

            if (properties.Length > 1)
            {
                parameter = Expression.Property(parameter, properties[0]);
                var        isCollection = typeof(IEnumerable).IsAssignableFrom(parameter.Type);
                Expression childParameter;
                if (isCollection)
                {
                    childType      = parameter.Type.GetGenericArguments()[0];
                    childParameter = Expression.Parameter(childType, childType.Name);
                }
                else
                {
                    childParameter = parameter;
                }
                var innerProperties             = properties.Skip(1).ToArray();
                var navigationPropertyPredicate = BuildCondition(childParameter, comparer, value, innerProperties);
                if (isCollection)
                {
                    var anyMethod = typeof(Enumerable).GetMethods().Single(m => m.Name == "Any" && m.GetParameters().Length == 2);
                    anyMethod = anyMethod.MakeGenericMethod(childType);
                    navigationPropertyPredicate = Expression.Call(anyMethod, parameter, navigationPropertyPredicate);
                    parameterExpression         = MakeLambda(parameter, navigationPropertyPredicate);
                }
                else
                {
                    parameterExpression = navigationPropertyPredicate;
                }
            }
            else
            {
                parameterExpression = Expression.Property(parameter, properties[0]);
                var valueExpression = Expression.Constant(value);
                var expression      = BuildExpression(parameterExpression, comparer, valueExpression);
                parameterExpression = MakeLambda(parameter, expression);
            }
            return(parameterExpression);
        }
Exemple #5
0
        private static Expression <Func <T1, bool> > BuildPredicate(object value, PredicateExpressionType comparer, string property)
        {
            var parameterExpression = Expression.Parameter(typeof(T1), typeof(T1).Name);

            return((Expression <Func <T1, bool> >)BuildCondition(parameterExpression, comparer, value, property.Split('.')));
        }
Exemple #6
0
        private static Expression BuildStringContainsCondition(Expression parameterExpression, PredicateExpressionType comparer, Expression valueExpression)
        {
            var contains = valueExpression.Type.GetMethod(Enum.GetName(typeof(PredicateExpressionType), comparer), new [] { typeof(string) });

            return(Expression.Call(parameterExpression, contains, valueExpression, Expression.Constant(StringComparison.CurrentCultureIgnoreCase)));
        }
Exemple #7
0
        private static Expression BuildStringCondition(Expression parameterExpression, PredicateExpressionType comparer, Expression valueExpression)
        {
            var compare = typeof(string).GetMethods().Single(m =>
                                                             m.Name.Equals(Enum.GetName(typeof(PredicateExpressionType), comparer)) &&
                                                             m.GetParameters().Length == 1);

            return(Expression.Call(parameterExpression, compare, valueExpression));
        }