コード例 #1
0
        private static Expression Evaluate(this SCIMLogicalExpression logicalExpression, ParameterExpression parameterExpression)
        {
            if (parameterExpression.Type == typeof(SCIMRepresentation))
            {
                var raExpression       = Expression.Parameter(typeof(SCIMRepresentationAttribute), "ra");
                var leftExpression     = logicalExpression.LeftExpression.Evaluate(raExpression);
                var rightExpression    = logicalExpression.RightExpression.Evaluate(raExpression);
                var anyLeftLambda      = Expression.Lambda <Func <SCIMRepresentationAttribute, bool> >(leftExpression, raExpression);
                var anyRightLambda     = Expression.Lambda <Func <SCIMRepresentationAttribute, bool> >(rightExpression, raExpression);
                var attributesProperty = Expression.Property(parameterExpression, "Attributes");
                var leftCall           = Expression.Call(typeof(Enumerable), "Any", new[] { typeof(SCIMRepresentationAttribute) }, attributesProperty, anyLeftLambda);
                var rightCall          = Expression.Call(typeof(Enumerable), "Any", new[] { typeof(SCIMRepresentationAttribute) }, attributesProperty, anyRightLambda);
                if (logicalExpression.LogicalOperator == SCIMLogicalOperators.AND)
                {
                    return(Expression.AndAlso(leftCall, rightCall));
                }

                return(Expression.OrElse(leftCall, rightCall));
            }
            else
            {
                var leftExpression  = logicalExpression.LeftExpression.Evaluate(parameterExpression);
                var rightExpression = logicalExpression.RightExpression.Evaluate(parameterExpression);
                if (logicalExpression.LogicalOperator == SCIMLogicalOperators.AND)
                {
                    return(Expression.AndAlso(leftExpression, rightExpression));
                }

                return(Expression.OrElse(leftExpression, rightExpression));
            }
        }
コード例 #2
0
        private static SCIMExpression TransformStringFiltersIntoSCIMLogicalExpression(IEnumerable <string> filters)
        {
            var logicalOperatorIndexes = new List <int>();

            for (var i = 0; i < filters.Count(); i++)
            {
                SCIMLogicalOperators op;
                if (Enum.GetNames(typeof(SCIMLogicalOperators)).Any(s => s.Equals(filters.ElementAt(i), StringComparison.InvariantCultureIgnoreCase)) && Enum.TryParse(filters.ElementAt(i), true, out op))
                {
                    logicalOperatorIndexes.Add(i);
                }
            }

            SCIMLogicalExpression rootExpression = null;

            foreach (var logicalOperatorIndex in logicalOperatorIndexes)
            {
                if (logicalOperatorIndex - 1 < 0 || logicalOperatorIndex + 1 >= filters.Count())
                {
                    throw new SCIMFilterException(Global.BadLogicalExpression);
                }

                var rightExpression = filters.ElementAt(logicalOperatorIndex + 1);
                var logicalOperator = filters.ElementAt(logicalOperatorIndex);
                if (rootExpression == null)
                {
                    var leftExpression = filters.ElementAt(logicalOperatorIndex - 1);
                    rootExpression = new SCIMLogicalExpression((SCIMLogicalOperators)Enum.Parse(typeof(SCIMLogicalOperators), logicalOperator, true), Parse(leftExpression), Parse(rightExpression));
                    continue;
                }

                rootExpression = new SCIMLogicalExpression(SCIMLogicalOperators.AND, (SCIMLogicalExpression)rootExpression.Clone(), Parse(rightExpression));
            }

            return(rootExpression);
        }