Enabled LessThan[OrEqual], GreaterThan[OrEqual] on strings using CompareTo method

This commit is contained in:
Boris Milašinović
2019-11-27 19:18:33 +01:00
parent 12642af4de
commit 2502f6acf4
3 changed files with 77 additions and 4 deletions
+1
View File
@@ -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) });
}
}
@@ -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)