From 47cdeb0efbf53314cb7de2fe136cd7bb03e4d4bd Mon Sep 17 00:00:00 2001 From: dlebee <36390643+dlebee@users.noreply.github.com> Date: Tue, 13 Nov 2018 08:19:13 -0500 Subject: [PATCH 1/3] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 10e74be..3b4da56 100644 --- a/README.md +++ b/README.md @@ -193,6 +193,7 @@ Assert.AreEqual(first?.FirstName, "David"); ### How it can be used in a web api > I highly suggest looking @ https://github.com/poweredsoft/dynamicquery if you are interested in this sample. +> Sample how to use DynamicQuery with asp.net mvc core and EF Core: https://github.com/PoweredSoft/DynamicQueryAspNetCoreSample ```csharp [HttpGet][Route("FindClients")] From 4398c908c9b62293fea32fa4e1bb9802a942e9df Mon Sep 17 00:00:00 2001 From: dlebee <36390643+dlebee@users.noreply.github.com> Date: Tue, 13 Nov 2018 08:19:31 -0500 Subject: [PATCH 2/3] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3b4da56..8d71597 100644 --- a/README.md +++ b/README.md @@ -193,6 +193,7 @@ Assert.AreEqual(first?.FirstName, "David"); ### How it can be used in a web api > I highly suggest looking @ https://github.com/poweredsoft/dynamicquery if you are interested in this sample. + > Sample how to use DynamicQuery with asp.net mvc core and EF Core: https://github.com/PoweredSoft/DynamicQueryAspNetCoreSample ```csharp From d97c540ad87dd46a801ac6a61966e728a0873255 Mon Sep 17 00:00:00 2001 From: Jon Galloway Date: Tue, 19 Mar 2019 14:54:48 -0700 Subject: [PATCH 3/3] added NotContains --- PoweredSoft.DynamicLinq.Test/ShortcutTests.cs | 24 +++++++++++++++++++ .../StringComparision.cs | 16 +++++++++++++ PoweredSoft.DynamicLinq/Constants.cs | 1 + .../Fluent/Where/WhereBuilder.shortcuts.cs | 11 +++++++++ .../Helpers/QueryableHelpers.cs | 7 ++++++ 5 files changed, 59 insertions(+) diff --git a/PoweredSoft.DynamicLinq.Test/ShortcutTests.cs b/PoweredSoft.DynamicLinq.Test/ShortcutTests.cs index 9025dda..63156b2 100644 --- a/PoweredSoft.DynamicLinq.Test/ShortcutTests.cs +++ b/PoweredSoft.DynamicLinq.Test/ShortcutTests.cs @@ -170,5 +170,29 @@ namespace PoweredSoft.DynamicLinq.Test var q3b = Persons.AsQueryable().Where(t => t.LastName.Contains("ee") || t.LastName.Contains("ar")); QueryableAssert.AreEqual(q3, q3b); } + + [TestMethod] + public void NotContains() + { + var q1 = Persons.AsQueryable().Query(t => t.NotContains("LastName", "ee")); + var q1b = Persons.AsQueryable().Where(t => !t.LastName.Contains("ee")); + QueryableAssert.AreEqual(q1, q1b); + + var q2 = Persons.AsQueryable().Query(t => t.NotContains("LastName", "ee").AndNotContains("FirstName", "vid")); + var q2b = Persons.AsQueryable().Where(t => !t.LastName.Contains("ee") && !t.FirstName.Contains("vid")); + QueryableAssert.AreEqual(q2, q2b); + + var q3 = Persons.AsQueryable().Query(t => t.NotContains("LastName", "ee").OrNotContains("LastName", "ar")); + var q3b = Persons.AsQueryable().Where(t => !t.LastName.Contains("ee") || !t.LastName.Contains("ar")); + QueryableAssert.AreEqual(q3, q3b); + } + + [TestMethod] + public void ContainsAndNotContains() + { + var q1 = Persons.AsQueryable().Query(t => t.Contains("LastName", "s").AndNotContains("LastName", "r")); + var q1b = Persons.AsQueryable().Where(t => t.LastName.Contains("s") && !t.LastName.Contains("r")); + QueryableAssert.AreEqual(q1, q1b); + } } } diff --git a/PoweredSoft.DynamicLinq.Test/StringComparision.cs b/PoweredSoft.DynamicLinq.Test/StringComparision.cs index a6163a1..431d054 100644 --- a/PoweredSoft.DynamicLinq.Test/StringComparision.cs +++ b/PoweredSoft.DynamicLinq.Test/StringComparision.cs @@ -60,6 +60,22 @@ namespace PoweredSoft.DynamicLinq.Test QueryableAssert.AreEqual(a, b, "CaseInsensitive"); } + [TestMethod] + public void NotContains() + { + IQueryable a, b; + + // case sensitive. + a = Persons.AsQueryable().Query(t => t.NotContains("FirstName", "vi", stringComparision: null)); + b = Persons.AsQueryable().Where(t => !t.FirstName.Contains("vi")); + QueryableAssert.AreEqual(a, b, "CaseSensitive"); + + // not case sensitive + a = Persons.AsQueryable().Query(t => t.NotContains("FirstName", "VI", stringComparision: StringComparison.OrdinalIgnoreCase)); + b = Persons.AsQueryable().Where(t => t.FirstName.IndexOf("VI", StringComparison.OrdinalIgnoreCase) == -1); + QueryableAssert.AreEqual(a, b, "CaseInsensitive"); + } + [TestMethod] public void StartsWith() { diff --git a/PoweredSoft.DynamicLinq/Constants.cs b/PoweredSoft.DynamicLinq/Constants.cs index 8e5c05e..f2f23ca 100644 --- a/PoweredSoft.DynamicLinq/Constants.cs +++ b/PoweredSoft.DynamicLinq/Constants.cs @@ -16,6 +16,7 @@ namespace PoweredSoft.DynamicLinq LessThan, LessThanOrEqual, Contains, + NotContains, StartsWith, EndsWith, In, diff --git a/PoweredSoft.DynamicLinq/Fluent/Where/WhereBuilder.shortcuts.cs b/PoweredSoft.DynamicLinq/Fluent/Where/WhereBuilder.shortcuts.cs index 658f42b..88c80b0 100644 --- a/PoweredSoft.DynamicLinq/Fluent/Where/WhereBuilder.shortcuts.cs +++ b/PoweredSoft.DynamicLinq/Fluent/Where/WhereBuilder.shortcuts.cs @@ -97,6 +97,17 @@ namespace PoweredSoft.DynamicLinq.Fluent => Or(path, ConditionOperators.Contains, value, convertStrategy: convertStrategy, collectionHandling: collectionHandling, stringComparision: stringComparision); #endregion + #region not contains + public WhereBuilder NotContains(string path, object value, QueryConvertStrategy convertStrategy = QueryConvertStrategy.ConvertConstantToComparedPropertyOrField, QueryCollectionHandling collectionHandling = QueryCollectionHandling.Any, StringComparison? stringComparision = null) + => And(path, ConditionOperators.NotContains, value, convertStrategy: convertStrategy, collectionHandling: collectionHandling, stringComparision: stringComparision); + + public WhereBuilder AndNotContains(string path, object value, QueryConvertStrategy convertStrategy = QueryConvertStrategy.ConvertConstantToComparedPropertyOrField, QueryCollectionHandling collectionHandling = QueryCollectionHandling.Any, StringComparison? stringComparision = null) + => And(path, ConditionOperators.NotContains, value, convertStrategy: convertStrategy, collectionHandling: collectionHandling, stringComparision: stringComparision); + + public WhereBuilder OrNotContains(string path, object value, QueryConvertStrategy convertStrategy = QueryConvertStrategy.ConvertConstantToComparedPropertyOrField, QueryCollectionHandling collectionHandling = QueryCollectionHandling.Any, StringComparison? stringComparision = null) + => Or(path, ConditionOperators.NotContains, value, convertStrategy: convertStrategy, collectionHandling: collectionHandling, stringComparision: stringComparision); + #endregion + #region starts with public WhereBuilder StartsWith(string path, object value, QueryConvertStrategy convertStrategy = QueryConvertStrategy.ConvertConstantToComparedPropertyOrField, QueryCollectionHandling collectionHandling = QueryCollectionHandling.Any, StringComparison? stringComparision = null) => And(path, ConditionOperators.StartsWith, value, convertStrategy: convertStrategy, collectionHandling: collectionHandling, stringComparision: stringComparision); diff --git a/PoweredSoft.DynamicLinq/Helpers/QueryableHelpers.cs b/PoweredSoft.DynamicLinq/Helpers/QueryableHelpers.cs index d9985a6..d4d3f04 100644 --- a/PoweredSoft.DynamicLinq/Helpers/QueryableHelpers.cs +++ b/PoweredSoft.DynamicLinq/Helpers/QueryableHelpers.cs @@ -61,6 +61,13 @@ namespace PoweredSoft.DynamicLinq.Helpers else ret = Expression.Call(member, Constants.ContainsMethod, constant); } + else if (conditionOperator == ConditionOperators.NotContains) + { + if (member.Type == stringType && stringComparision.HasValue) + ret = Expression.GreaterThan(Expression.Not(Expression.Call(member, Constants.IndexOfMethod, constant, Expression.Constant(stringComparision.Value))), Expression.Constant(-1)); + else + ret = Expression.Not(Expression.Call(member, Constants.ContainsMethod, constant)); + } else if (conditionOperator == ConditionOperators.StartsWith) { if (member.Type == stringType && stringComparision.HasValue)