supporting negate.

This commit is contained in:
David Lebee
2019-03-19 17:01:09 -05:00
parent e97fd56746
commit 5f9d5ca715
5 changed files with 63 additions and 47 deletions
@@ -16,7 +16,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
public static Expression GetConditionExpressionForMember(ParameterExpression parameter, Expression member, ConditionOperators conditionOperator, ConstantExpression constant, StringComparison? stringComparision)
public static Expression GetConditionExpressionForMember(ParameterExpression parameter, Expression member, ConditionOperators conditionOperator, ConstantExpression constant, StringComparison? stringComparision, bool negate)
{
if (parameter == null)
throw new ArgumentNullException("parameter");
@@ -78,6 +78,9 @@ namespace PoweredSoft.DynamicLinq.Helpers
else
throw new ArgumentException("conditionOperator", "Must supply a known condition operator");
if (negate)
ret = Expression.Not(ret);
return ret;
}
@@ -436,7 +439,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
*/
internal static Expression InternalCreateConditionExpression(int recursionStep, Type type, ParameterExpression parameter, Expression current, List<string> parts,
ConditionOperators condition, object value, QueryConvertStrategy convertStrategy, QueryCollectionHandling collectionHandling, bool nullChecking, StringComparison? stringComparison)
ConditionOperators condition, object value, QueryConvertStrategy convertStrategy, QueryCollectionHandling collectionHandling, bool nullChecking, StringComparison? stringComparison, bool negate)
{
var partStr = parts.First();
var isLast = parts.Count == 1;
@@ -460,7 +463,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
else
{
var constant = QueryableHelpers.ResolveConstant(memberExpression, value, convertStrategy);
var filterExpression = QueryableHelpers.GetConditionExpressionForMember(parameter, memberExpression, condition, constant, stringComparison);
var filterExpression = QueryableHelpers.GetConditionExpressionForMember(parameter, memberExpression, condition, constant, stringComparison, negate);
var lambda = Expression.Lambda(filterExpression, parameter);
return lambda;
}
@@ -475,7 +478,7 @@ namespace PoweredSoft.DynamicLinq.Helpers
{
var listGenericArgumentType = memberExpression.Type.GetGenericArguments().First();
var innerParameter = Expression.Parameter(listGenericArgumentType, $"t{++recursionStep}");
var innerLambda = InternalCreateConditionExpression(recursionStep, listGenericArgumentType, innerParameter, innerParameter, parts.Skip(1).ToList(), condition, value, convertStrategy, collectionHandling, nullChecking, stringComparison);
var innerLambda = InternalCreateConditionExpression(recursionStep, listGenericArgumentType, innerParameter, innerParameter, parts.Skip(1).ToList(), condition, value, convertStrategy, collectionHandling, nullChecking, stringComparison, negate);
// the collection method.
var collectionMethod = GetCollectionMethod(collectionHandling);
@@ -494,14 +497,14 @@ namespace PoweredSoft.DynamicLinq.Helpers
{
if (nullCheckExpression != null)
{
var pathExpr = InternalCreateConditionExpression(recursionStep, type, parameter, memberExpression, parts.Skip(1).ToList(), condition, value, convertStrategy, collectionHandling, nullChecking, stringComparison);
var pathExpr = InternalCreateConditionExpression(recursionStep, type, parameter, memberExpression, parts.Skip(1).ToList(), condition, value, convertStrategy, collectionHandling, nullChecking, stringComparison, negate);
var nullCheckResult = Expression.AndAlso(nullCheckExpression, (pathExpr as LambdaExpression).Body);
var nullCheckResultLambda = Expression.Lambda((Expression)nullCheckResult, parameter);
return nullCheckResultLambda;
}
return InternalCreateConditionExpression(recursionStep, type, parameter, memberExpression, parts.Skip(1).ToList(), condition, value, convertStrategy, collectionHandling, nullChecking, stringComparison);
return InternalCreateConditionExpression(recursionStep, type, parameter, memberExpression, parts.Skip(1).ToList(), condition, value, convertStrategy, collectionHandling, nullChecking, stringComparison, negate);
}
}
@@ -560,13 +563,14 @@ namespace PoweredSoft.DynamicLinq.Helpers
QueryCollectionHandling collectionHandling = QueryCollectionHandling.Any,
ParameterExpression parameter = null,
bool nullChecking = false,
StringComparison? stringComparision = null)
StringComparison? stringComparision = null, bool negate = false)
{
var ret = CreateConditionExpression(typeof(T), path, condition, value, convertStrategy,
collectionHandling: collectionHandling,
parameter: parameter,
nullChecking: nullChecking,
stringComparision: stringComparision) as Expression<Func<T, bool>>;
stringComparision: stringComparision,
negate: negate) as Expression<Func<T, bool>>;
return ret;
}
@@ -578,13 +582,14 @@ namespace PoweredSoft.DynamicLinq.Helpers
QueryCollectionHandling collectionHandling = QueryCollectionHandling.Any,
ParameterExpression parameter = null,
bool nullChecking = false,
StringComparison? stringComparision = null)
StringComparison? stringComparision = null,
bool negate = false)
{
if (parameter == null)
parameter = Expression.Parameter(type, "t");
var parts = path.Split('.').ToList();
var result = InternalCreateConditionExpression(1, type, parameter, parameter, parts, condition, value, convertStrategy, collectionHandling, nullChecking, stringComparision);
var result = InternalCreateConditionExpression(1, type, parameter, parameter, parts, condition, value, convertStrategy, collectionHandling, nullChecking, stringComparision, negate);
return result;
}