public virtual Expression Translate(MethodCallExpression methodCallExpression) { if (Equals(methodCallExpression.Method, _methodInfo)) { var patternExpression = methodCallExpression.Arguments[0]; var endsWithExpression = new NullCompensatedExpression( Expression.Equal( new SqlFunctionExpression( "SUBSTR", // ReSharper disable once PossibleNullReferenceException methodCallExpression.Object.Type, new[] { methodCallExpression.Object, Expression.Negate( new SqlFunctionExpression("LENGTH", typeof(int), new[] { patternExpression })) }), patternExpression)); return(patternExpression is ConstantExpression patternConstantExpression ? (string)patternConstantExpression.Value == string.Empty ? (Expression)Expression.Constant(true) : endsWithExpression : Expression.OrElse( endsWithExpression, Expression.Equal(patternExpression, Expression.Constant(string.Empty)))); } return(null); }
/// <summary> /// 转换 /// </summary> /// <param name="methodCallExpression">方法调用表达式</param> /// <returns></returns> public virtual Expression Translate(MethodCallExpression methodCallExpression) { if (object.Equals(methodCallExpression.Method, _methodInfo)) { Expression expression = methodCallExpression.Arguments[0]; NullCompensatedExpression nullCompensatedExpression = new NullCompensatedExpression(Expression.Equal(new SqlFunctionExpression("SUBSTR", methodCallExpression.Object.Type, new Expression[2] { methodCallExpression.Object, Expression.Negate(new SqlFunctionExpression("LENGTH", typeof(int), new Expression[1] { expression })) }), expression)); ConstantExpression constantExpression; if ((constantExpression = (expression as ConstantExpression)) == null) { return(Expression.OrElse(nullCompensatedExpression, Expression.Equal(expression, Expression.Constant(string.Empty)))); } string obj = (string)constantExpression.Value; if (obj == null || obj.Length != 0) { return(nullCompensatedExpression); } return(Expression.Constant(true)); } return(null); }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public virtual Expression Translate( MethodCallExpression methodCallExpression, IDiagnosticsLogger <DbLoggerCategory.Query> logger) { if (Equals(methodCallExpression.Method, _methodInfo)) { var patternExpression = methodCallExpression.Arguments[0]; var endsWithExpression = new NullCompensatedExpression( Expression.Equal( new SqlFunctionExpression( "RIGHT", // ReSharper disable once PossibleNullReferenceException methodCallExpression.Object.Type, new[] { methodCallExpression.Object, new SqlFunctionExpression("LEN", typeof(int), new[] { patternExpression }) }), patternExpression)); return(patternExpression is ConstantExpression patternConstantExpression ? ((string)patternConstantExpression.Value)?.Length == 0 ? (Expression)Expression.Constant(true) : endsWithExpression : Expression.OrElse( endsWithExpression, Expression.Equal(patternExpression, Expression.Constant(string.Empty)))); } return(null); }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> protected override Expression VisitExtension(Expression expression) { var selectExpression = expression as SelectExpression; if (selectExpression?.Predicate != null) { var predicate = new EqualityPredicateInExpressionOptimizer().Visit(selectExpression.Predicate); var predicateNegationExpressionOptimizer = new PredicateNegationExpressionOptimizer(); predicate = predicateNegationExpressionOptimizer.Visit(predicate); predicate = new PredicateReductionExpressionOptimizer().Visit(predicate); predicate = new EqualityPredicateExpandingVisitor().Visit(predicate); predicate = predicateNegationExpressionOptimizer.Visit(predicate); if (_useRelationalNulls) { predicate = new NullCompensatedExpression(predicate); } selectExpression.Predicate = predicate; } else if (expression is PredicateJoinExpressionBase joinExpression) { joinExpression.Predicate = new DiscriminatorPredicateOptimizingVisitor().Visit(joinExpression.Predicate); joinExpression.Predicate = new EqualityPredicateInExpressionOptimizer().Visit(joinExpression.Predicate); } return(base.VisitExtension(expression)); }
public virtual Expression Translate(MethodCallExpression methodCallExpression) { if (Equals(methodCallExpression.Method, _methodInfo)) { var patternExpression = methodCallExpression.Arguments[0]; var patternConstantExpression = patternExpression as ConstantExpression; var endsWithExpression = new NullCompensatedExpression( Expression.Equal( new SqlFunctionExpression( "RIGHT", methodCallExpression.Object.Type, new[] { methodCallExpression.Object, new SqlFunctionExpression("CHARACTER_LENGTH", typeof(int), new[] { patternExpression }) }), patternExpression)); return(patternConstantExpression != null ? (string)patternConstantExpression.Value == string.Empty ? (Expression)Expression.Constant(true) : endsWithExpression : Expression.OrElse( endsWithExpression, Expression.Equal(patternExpression, Expression.Constant(string.Empty)))); } return(null); }
private static Expression MakeEndsWithExpressionImpl( [NotNull] Expression target, [NotNull] Expression suffix, [NotNull] Expression originalSuffix) { var endsWithExpression = new NullCompensatedExpression(Expression.Equal( new SqlFunctionExpression( "RIGHT", target.Type, new[] { target, CharLength(suffix) }), suffix)); if (originalSuffix is ConstantExpression constantSuffix) { return((string)constantSuffix.Value == string.Empty ? (Expression)Expression.Constant(true) : endsWithExpression); } else { return(Expression.OrElse( endsWithExpression, Expression.Equal(originalSuffix, Expression.Constant(string.Empty)))); } }