diff --git a/PoweredSoft.DynamicQuery.Core/ISimpleFilter.cs b/PoweredSoft.DynamicQuery.Core/ISimpleFilter.cs index 3baf1c5..c8a9b14 100644 --- a/PoweredSoft.DynamicQuery.Core/ISimpleFilter.cs +++ b/PoweredSoft.DynamicQuery.Core/ISimpleFilter.cs @@ -5,5 +5,6 @@ string Path { get; set; } object Value { get; set; } bool? Not { get; set; } + bool? CaseInsensitive { get; set; } } } diff --git a/PoweredSoft.DynamicQuery.Test/FilterTests.cs b/PoweredSoft.DynamicQuery.Test/FilterTests.cs index fdc918f..258a87d 100644 --- a/PoweredSoft.DynamicQuery.Test/FilterTests.cs +++ b/PoweredSoft.DynamicQuery.Test/FilterTests.cs @@ -18,6 +18,7 @@ namespace PoweredSoft.DynamicQuery.Test public string Path { get; set; } = "FirstName"; public object Value { get; set; } = "Chuck"; public bool? Not { get; set; } + public bool? CaseInsensitive { get; set; } } [Fact] @@ -38,6 +39,8 @@ namespace PoweredSoft.DynamicQuery.Test }); } + + [Fact] public void SimpleFilter() { @@ -64,6 +67,33 @@ namespace PoweredSoft.DynamicQuery.Test }); } + [Fact] + public void SimpleFilterCaseInsensitive() + { + MockContextFactory.SeedAndTestContextFor("FilterTests_SimpleFilterCaseInsensitive", TestSeeders.SimpleSeedScenario, ctx => + { + var resultShouldMatch = ctx.Items.Where(t => t.Name.ToLower().EndsWith("Cables".ToLower())).ToList(); + + var criteria = new QueryCriteria() + { + Filters = new List + { + new SimpleFilter + { + Path = "Name", + Type = FilterType.EndsWith, + Value = "Cables", + CaseInsensitive = true + } + } + }; + + var queryHandler = new QueryHandler(Enumerable.Empty()); + var result = queryHandler.Execute(ctx.Items, criteria); + Assert.Equal(resultShouldMatch, result.Data); + }); + } + [Fact] diff --git a/PoweredSoft.DynamicQuery/Filter.cs b/PoweredSoft.DynamicQuery/Filter.cs index 4538e19..3d65b6b 100644 --- a/PoweredSoft.DynamicQuery/Filter.cs +++ b/PoweredSoft.DynamicQuery/Filter.cs @@ -18,6 +18,7 @@ namespace PoweredSoft.DynamicQuery public FilterType Type { get; set; } public string Path { get; set; } public object Value { get; set; } + public bool? CaseInsensitive { get; set; } } public class CompositeFilter : ICompositeFilter diff --git a/PoweredSoft.DynamicQuery/PoweredSoft.DynamicQuery.csproj b/PoweredSoft.DynamicQuery/PoweredSoft.DynamicQuery.csproj index 35dbd7b..ef1d2ad 100644 --- a/PoweredSoft.DynamicQuery/PoweredSoft.DynamicQuery.csproj +++ b/PoweredSoft.DynamicQuery/PoweredSoft.DynamicQuery.csproj @@ -21,7 +21,7 @@ - + diff --git a/PoweredSoft.DynamicQuery/QueryHandlerBase.cs b/PoweredSoft.DynamicQuery/QueryHandlerBase.cs index ceab998..ef52608 100644 --- a/PoweredSoft.DynamicQuery/QueryHandlerBase.cs +++ b/PoweredSoft.DynamicQuery/QueryHandlerBase.cs @@ -366,6 +366,13 @@ namespace PoweredSoft.DynamicQuery protected virtual void ApplySimpleFilter(WhereBuilder whereBuilder, ISimpleFilter filter) { var resolvedConditionOperator = ResolveConditionOperatorFrom(filter.Type); + + if (filter.CaseInsensitive == true) + { + filter.Path += ".ToLower()"; + filter.Value = $"{filter.Value}"?.ToLower(); + } + whereBuilder.Compare(filter.Path, resolvedConditionOperator, filter.Value, and: filter.And == true, negate: filter.Not == true); }