Exemplo n.º 1
0
        private static Expression BuildWhereExpression(Expression parameter, ConditionType conditionType, dynamic[] values, params string[] properties)
        {
            Type childType = null;

            if (properties.Count() > 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();
                Expression predicate       = BuildWhereExpression(childParameter, conditionType, values, innerProperties);
                if (isCollection)
                {
                    //build subquery
                    predicate = BuildWhereSubQueryExpression(parameter, childParameter, childType, predicate);
                }

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

            foreach (var d in values)
            {
                var tt = ConvertHelper.Convert(d, childProperty.PropertyType);
                ConstantExpression val           = Expression.Constant(tt, childProperty.PropertyType);
                Expression         newExpression = conditionType.ToBinaryExpression(memberExpression, val); //MakeLambda(parameter, conditionType.ToBinaryExpression(memberExpression, val));

                if (orExpression == null)
                {
                    orExpression = newExpression;
                }
                else
                {
                    orExpression = Expression.OrElse(orExpression, newExpression);
                }
            }
            return(orExpression);
        }