public override Expression BuildExpression(Locator locator, Expression parent, int level) { var innerLocator = (MemberLocator)locator; Expression result = Expression.Property(parent, innerLocator.Property); if (innerLocator.AsString) { result = Expression.Call(result, innerLocator.GetType().GetMethod("ToString")); } if (locator.Left == null) { return(result); } result = _factory.BuildLocatorExpression(locator.Left, result, level); if (locator.Right == null) { return(result); } var right = _factory.BuildLocatorExpression(locator.Right, result, level); var binaryOperator = ExpressionTypeHelper.GetByLocator(innerLocator.Operation); return(Expression.MakeBinary(binaryOperator, result, right)); }
public override Expression BuildExpression(Locator locator, Expression parent, int level) { var resultLeft = locator.Left == null ? Expression.Constant("") : _factory.BuildLocatorExpression(locator.Left, parent, level); var resultRight = locator.Right == null ? Expression.Constant("") : _factory.BuildLocatorExpression(locator.Right, parent, level); return(Expression.Call(_method, resultLeft, resultRight)); }
/// <exception cref="OverflowException"><paramref name="locator.Conditions" /> Enum Names should be equivalent</exception> public override Expression BuildExpression(Locator locator, Expression parent, int level) { var result = parent; //ExpressionHelper.MakeAsEnumerableExpression(parent); if (locator.Conditions != null && locator.Conditions.Any()) { var type = result.Type.GenericTypeArguments.First(); var parameter = Expression.Parameter(type, $"{type.Name.ToLower()}{level}"); var lambdaBody = _factory.BuildExpressionForConditions(locator.Conditions, parameter, level); Expression lambda = Expression.Lambda(lambdaBody, parameter); result = MakeAnyExpression(lambda, result); return(result); } if (locator.Conditions != null && locator.Left != null && !locator.Conditions.Any()) { var type = result.Type.GenericTypeArguments.First(); var parameter = Expression.Parameter(type, $"{type.Name.ToLower()}{level}"); var lambdaBody = _factory.BuildLocatorExpression(locator.Left, parameter, level); if (locator.Left.Type == LocatorType.Constant) { lambdaBody = Expression.Equal(parameter, lambdaBody); } Expression lambda = Expression.Lambda(lambdaBody, parameter); result = MakeAnyExpression(lambda, result); return(result); } result = MakeAnyExpression(result); return(result); }
public override Expression BuildExpression(Locator locator, Expression parent, int level) { var innerLocator = (ConstantLocator)locator; Expression result = Expression.Constant(innerLocator.Value); if (innerLocator.TryCast) { result = Expression.Convert(result, parent.Type); } return(locator.Left == null ? result : _factory.BuildLocatorExpression(locator.Left, result, level)); }