From 2502f6acf411deadc83c6fbdff3cf043141435d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Boris=20Mila=C5=A1inovi=C4=87?= Date: Wed, 27 Nov 2019 19:18:33 +0100 Subject: [PATCH] Enabled LessThan[OrEqual], GreaterThan[OrEqual] on strings using CompareTo method --- .../StringComparision.cs | 52 +++++++++++++++++++ PoweredSoft.DynamicLinq/Constants.cs | 1 + .../Helpers/QueryableHelpers.cs | 28 ++++++++-- 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/PoweredSoft.DynamicLinq.Test/StringComparision.cs b/PoweredSoft.DynamicLinq.Test/StringComparision.cs index aeaf524..4b9fa42 100644 --- a/PoweredSoft.DynamicLinq.Test/StringComparision.cs +++ b/PoweredSoft.DynamicLinq.Test/StringComparision.cs @@ -123,5 +123,57 @@ namespace PoweredSoft.DynamicLinq.Test b = Persons.AsQueryable().Where(t => t.FirstName.EndsWith("VID", StringComparison.OrdinalIgnoreCase)); QueryableAssert.AreEqual(a, b, "CaseInsensitive"); } + + [DataTestMethod] + [DataRow("Denis")] + [DataRow("Ann")] + [DataRow("Tony")] + public void LessThan(string firstName) + { + IQueryable a, b; + + a = Persons.AsQueryable().Query(t => t.LessThan("FirstName", firstName)); + b = Persons.AsQueryable().Where(t => t.FirstName.CompareTo(firstName) < 0); + QueryableAssert.AreEqual(a, b); + } + + [DataTestMethod] + [DataRow("Denis")] + [DataRow("Ann")] + [DataRow("Tony")] + public void LessThanOrEqual(string firstName) + { + IQueryable a, b; + + a = Persons.AsQueryable().Query(t => t.LessThanOrEqual("FirstName", firstName)); + b = Persons.AsQueryable().Where(t => t.FirstName.CompareTo(firstName) <= 0); + QueryableAssert.AreEqual(a, b); + } + + [DataTestMethod] + [DataRow("Denis")] + [DataRow("Ann")] + [DataRow("Tony")] + public void GreaterThan(string firstName) + { + IQueryable a, b; + + a = Persons.AsQueryable().Query(t => t.GreaterThan("FirstName", firstName)); + b = Persons.AsQueryable().Where(t => t.FirstName.CompareTo(firstName) > 0); + QueryableAssert.AreEqual(a, b); + } + + [DataTestMethod] + [DataRow("Denis")] + [DataRow("Ann")] + [DataRow("Tony")] + public void GreaterThanOrEqual(string firstName) + { + IQueryable a, b; + + a = Persons.AsQueryable().Query(t => t.GreaterThanOrEqual("FirstName", firstName)); + b = Persons.AsQueryable().Where(t => t.FirstName.CompareTo(firstName) >= 0); + QueryableAssert.AreEqual(a, b); + } } } diff --git a/PoweredSoft.DynamicLinq/Constants.cs b/PoweredSoft.DynamicLinq/Constants.cs index f2f23ca..b94e6da 100644 --- a/PoweredSoft.DynamicLinq/Constants.cs +++ b/PoweredSoft.DynamicLinq/Constants.cs @@ -78,5 +78,6 @@ namespace PoweredSoft.DynamicLinq internal static readonly MethodInfo IndexOfMethod = typeof(string).GetMethod("IndexOf", new Type[] { typeof(string), typeof(StringComparison) }); internal static readonly MethodInfo AnyMethod = typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).First(t => t.Name == "Any" && t.GetParameters().Count() == 2); internal static readonly MethodInfo AllMethod = typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public).First(t => t.Name == "All" && t.GetParameters().Count() == 2); + internal static readonly MethodInfo CompareToMethod = typeof(string).GetMethod("CompareTo", new Type[] { typeof(string) }); } } diff --git a/PoweredSoft.DynamicLinq/Helpers/QueryableHelpers.cs b/PoweredSoft.DynamicLinq/Helpers/QueryableHelpers.cs index f64f18d..7587b4e 100644 --- a/PoweredSoft.DynamicLinq/Helpers/QueryableHelpers.cs +++ b/PoweredSoft.DynamicLinq/Helpers/QueryableHelpers.cs @@ -47,13 +47,33 @@ namespace PoweredSoft.DynamicLinq.Helpers ret = Expression.NotEqual(member, constant); } else if (conditionOperator == ConditionOperators.GreaterThan) - ret = Expression.GreaterThan(member, constant); + { + if (member.Type == stringType) + ret = Expression.GreaterThan(Expression.Call(member, Constants.CompareToMethod, constant), Expression.Constant(0)); + else + ret = Expression.GreaterThan(member, constant); + } else if (conditionOperator == ConditionOperators.GreaterThanOrEqual) - ret = Expression.GreaterThanOrEqual(member, constant); + { + if (member.Type == stringType) + ret = Expression.GreaterThanOrEqual(Expression.Call(member, Constants.CompareToMethod, constant), Expression.Constant(0)); + else + ret = Expression.GreaterThanOrEqual(member, constant); + } else if (conditionOperator == ConditionOperators.LessThan) - ret = Expression.LessThan(member, constant); + { + if (member.Type == stringType) + ret = Expression.LessThan(Expression.Call(member, Constants.CompareToMethod, constant), Expression.Constant(0)); + else + ret = Expression.LessThan(member, constant); + } else if (conditionOperator == ConditionOperators.LessThanOrEqual) - ret = Expression.LessThanOrEqual(member, constant); + { + if (member.Type == stringType) + ret = Expression.LessThanOrEqual(Expression.Call(member, Constants.CompareToMethod, constant), Expression.Constant(0)); + else + ret = Expression.LessThanOrEqual(member, constant); + } else if (conditionOperator == ConditionOperators.Contains) { if (member.Type == stringType && stringComparision.HasValue)