private Expression BuildEqualityFilter(EqualityMatchFilter filter, Expression itemExpression) { if (filter.AttributeDesc == "cn") { Expression left = Expression.Property(itemExpression, "Dn"); string baseObj = (_searchEvent.SearchRequest.BaseObject == "") ? "" : "," + _searchEvent.SearchRequest.BaseObject; Expression right = Expression.Constant("cn=" + filter.AssertionValue + baseObj); return(Expression.Equal(left, right)); } else { Expression attributeExpr = Expression.Property(itemExpression, "Attributes"); // Pair to search for ParameterExpression keyValuePair = Expression.Parameter(typeof(KeyValuePair <string, List <string> >), "a"); // (a.Key == attributeName) Expression subExprLeftAttributeName = Expression.Property(keyValuePair, "Key"); Expression subExprRightAttributeName = Expression.Constant(filter.AttributeDesc.ToLower()); Expression subExprAttributeName = Expression.Equal(subExprLeftAttributeName, subExprRightAttributeName); // a.Value.Contains(attributeValue) Expression subExprValue = Expression.Property(keyValuePair, "Value"); Expression subExprContains = Expression.Call(subExprValue, typeof(List <string>).GetMethod("Contains", new Type[] { typeof(string) }), Expression.Constant(filter.AssertionValue)); // ((a.Key == attributeName) && a.Value.Contains(attributeValue)) Expression attributeExprMatch = Expression.And(subExprAttributeName, subExprContains); // {a => ((a.Key == attributeName) And a.Value.Contains(attributeValue))} var lambda = Expression.Lambda <Func <KeyValuePair <string, List <string> >, bool> >(attributeExprMatch, keyValuePair); MethodInfo anyMethod = typeof(Enumerable).GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).First(m => m.Name == "Any" && m.GetParameters().Count() == 2).MakeGenericMethod(typeof(KeyValuePair <string, List <string> >)); return(Expression.Call(anyMethod, attributeExpr, lambda)); } }
private Expression BuildEqualityFilter(EqualityMatchFilter filter, Expression itemExpression) { if (filter.AttributeDesc == "cn") { Expression left = GetMemberExpressionForAttribute(itemExpression, MemberExpressionAttributes.CN); Expression right = Expression.Constant(filter.AssertionValue.ToUpper()); return(Expression.Equal(left, right)); } else if (filter.AttributeDesc == "email") { Expression left = GetMemberExpressionForAttribute(itemExpression, MemberExpressionAttributes.Email); Expression right = Expression.Constant(filter.AssertionValue.ToUpper()); return(Expression.Equal(left, right)); } else if (filter.AttributeDesc == "displayname") { Expression left = GetMemberExpressionForAttribute(itemExpression, MemberExpressionAttributes.DisplayName); Expression right = Expression.Constant(filter.AssertionValue.ToUpper()); return(Expression.Equal(left, right)); } else if (filter.AttributeDesc == "entryuuid") { Expression left = GetMemberExpressionForAttribute(itemExpression, MemberExpressionAttributes.EntryUUID); Expression right = Expression.Constant(new Guid(filter.AssertionValue)); return(Expression.Equal(left, right)); } else if (filter.AttributeDesc == "objectclass") { if (filter.AssertionValue == "inetOrgPerson") { return(GetAlwaysTrueExpression()); } else { return(GetAlwaysFalseExpression()); } } else if (filter.AttributeDesc == "dn") { return(GetAlwaysFalseExpression()); } return(GetAlwaysFalseExpression()); }