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)); } }
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); }