diff --git a/DynamicExpressions.UnitTests/PredicateTests.cs b/DynamicExpressions.UnitTests/PredicateTests.cs index 4b60348..3da11ce 100644 --- a/DynamicExpressions.UnitTests/PredicateTests.cs +++ b/DynamicExpressions.UnitTests/PredicateTests.cs @@ -43,6 +43,7 @@ public void GetPredicate_ShouldHandleEqualsGenericOperators(int id, T title, [InlineData(3, "Title 3", FilterOperator.NotContains, "5")] [InlineData(4, "Title 4", FilterOperator.StartsWith, "Title")] [InlineData(5, "Title 5", FilterOperator.EndsWith, "5")] + [InlineData(5, "Title 6", FilterOperator.ContainsIgnoreCase, "title")] public void GetPredicate_ShouldHandleNestedStringOperators(int id, string title, FilterOperator op, object value) { var entry = new Entry(id, new SubEntry(title)); diff --git a/DynamicExpressions/DynamicExpressions.cs b/DynamicExpressions/DynamicExpressions.cs index c2ef463..692ff0a 100644 --- a/DynamicExpressions/DynamicExpressions.cs +++ b/DynamicExpressions/DynamicExpressions.cs @@ -16,8 +16,9 @@ public static class DynamicExpressions private static readonly MethodInfo _stringContainsMethod = typeof(string).GetMethod("Contains" , new Type[] { typeof(string) }); + private static readonly MethodInfo _stringContainsMethodIgnoreCase = typeof(string).GetMethod("Contains" + , new Type[] { typeof(string), typeof(StringComparison) }); private static readonly MethodInfo _enumerableContainsMethod = typeof(Enumerable).GetMethods().Where(x => string.Equals(x.Name, "Contains", StringComparison.OrdinalIgnoreCase)).Single(x => x.GetParameters().Length == 2).MakeGenericMethod(typeof(string)); - private static readonly MethodInfo _dictionaryContainsKeyMethod = typeof(Dictionary).GetMethods().Where(x => string.Equals(x.Name, "ContainsKey", StringComparison.OrdinalIgnoreCase)).Single(); private static readonly MethodInfo _dictionaryContainsValueMethod = typeof(Dictionary).GetMethods().Where(x => string.Equals(x.Name, "ContainsValue", StringComparison.OrdinalIgnoreCase)).Single(); @@ -61,6 +62,7 @@ private static Expression CreateFilter(MemberExpression prop, FilterOperator op, FilterOperator.Equals => RobustEquals(prop, constant), FilterOperator.GreaterThan => Expression.GreaterThan(prop, constant), FilterOperator.LessThan => Expression.LessThan(prop, constant), + FilterOperator.ContainsIgnoreCase => Expression.Call(prop, _stringContainsMethodIgnoreCase, PrepareConstant(constant), Expression.Constant(StringComparison.OrdinalIgnoreCase)), FilterOperator.Contains => GetContainsMethodCallExpression(prop, constant), FilterOperator.NotContains => Expression.Not(GetContainsMethodCallExpression(prop, constant)), FilterOperator.ContainsKey => Expression.Call(prop, _dictionaryContainsKeyMethod, PrepareConstant(constant)), diff --git a/DynamicExpressions/FilterOperator.cs b/DynamicExpressions/FilterOperator.cs index da192b0..140119a 100644 --- a/DynamicExpressions/FilterOperator.cs +++ b/DynamicExpressions/FilterOperator.cs @@ -12,6 +12,7 @@ public enum FilterOperator NotContains, StartsWith, EndsWith, + ContainsIgnoreCase, IsEmpty, IsNotEmpty, ContainsKey,