Renamed Umbraco.Abstractions to Umbraco.Core

This commit is contained in:
Bjarke Berg
2020-02-24 08:21:53 +01:00
parent 46f00cf960
commit 90c2381c86
1117 changed files with 30 additions and 30 deletions

View File

@@ -0,0 +1,74 @@
using System;
using System.Linq.Expressions;
using System.Reflection;
namespace Umbraco.Web.Models.TemplateQuery
{
internal static class QueryConditionExtensions
{
private static Lazy<MethodInfo> StringContainsMethodInfo =>
new Lazy<MethodInfo>(() => typeof(string).GetMethod("Contains", new[] {typeof(string)}));
public static Expression<Func<T, bool>> BuildCondition<T>(this QueryCondition condition, string parameterAlias)
{
object constraintValue;
switch (condition.Property.Type.ToLowerInvariant())
{
case "string":
constraintValue = condition.ConstraintValue;
break;
case "datetime":
constraintValue = DateTime.Parse(condition.ConstraintValue);
break;
case "boolean":
constraintValue = Boolean.Parse(condition.ConstraintValue);
break;
default:
constraintValue = Convert.ChangeType(condition.ConstraintValue, typeof(int));
break;
}
var parameterExpression = Expression.Parameter(typeof(T), parameterAlias);
var propertyExpression = Expression.Property(parameterExpression, condition.Property.Alias);
var valueExpression = Expression.Constant(constraintValue);
Expression bodyExpression;
switch (condition.Term.Operator)
{
case Operator.NotEquals:
bodyExpression = Expression.NotEqual(propertyExpression, valueExpression);
break;
case Operator.GreaterThan:
bodyExpression = Expression.GreaterThan(propertyExpression, valueExpression);
break;
case Operator.GreaterThanEqualTo:
bodyExpression = Expression.GreaterThanOrEqual(propertyExpression, valueExpression);
break;
case Operator.LessThan:
bodyExpression = Expression.LessThan(propertyExpression, valueExpression);
break;
case Operator.LessThanEqualTo:
bodyExpression = Expression.LessThanOrEqual(propertyExpression, valueExpression);
break;
case Operator.Contains:
bodyExpression = Expression.Call(propertyExpression, StringContainsMethodInfo.Value,
valueExpression);
break;
case Operator.NotContains:
var tempExpression = Expression.Call(propertyExpression, StringContainsMethodInfo.Value,
valueExpression);
bodyExpression = Expression.Equal(tempExpression, Expression.Constant(false));
break;
default:
case Operator.Equals:
bodyExpression = Expression.Equal(propertyExpression, valueExpression);
break;
}
var predicate =
Expression.Lambda<Func<T, bool>>(bodyExpression.Reduce(), parameterExpression);
return predicate;
}
}
}