/// <summary> /// Visits the SQL like expression. /// </summary> private static void VisitSqlLike(MethodCallExpression expression, CacheQueryExpressionVisitor visitor, string likeFormat) { visitor.ResultBuilder.Append("("); visitor.Visit(expression.Object); visitor.ResultBuilder.AppendFormat(" like {0}) ", likeFormat); var arg = expression.Arguments[0] as ConstantExpression; var paramValue = arg != null ? arg.Value : visitor.RegisterEvaluatedParameter(expression.Arguments[0]); visitor.Parameters.Add(paramValue); }
/// <summary> /// Appends the adjustment. /// </summary> private static void AppendAdjustment(CacheQueryExpressionVisitor visitor, int[] adjust, int idx) { if (idx < adjust.Length) { var delta = adjust[idx]; if (delta > 0) visitor.ResultBuilder.AppendFormat(" + {0}", delta); else if (delta < 0) visitor.ResultBuilder.AppendFormat(" {0}", delta); } }
/// <summary> /// Visits the instance function. /// </summary> private static void VisitFunc(MethodCallExpression expression, CacheQueryExpressionVisitor visitor, string func, string suffix, params int[] adjust) { visitor.ResultBuilder.Append(func).Append("("); var isInstanceMethod = expression.Object != null; if (isInstanceMethod) visitor.Visit(expression.Object); for (int i= 0; i < expression.Arguments.Count; i++) { var arg = expression.Arguments[i]; if (isInstanceMethod || (i > 0)) visitor.ResultBuilder.Append(", "); if (arg.NodeType == ExpressionType.NewArrayInit) { // Only trim methods use params[], only one param is supported var args = ((NewArrayExpression) arg).Expressions; if (args.Count != 1) throw new NotSupportedException("Method call only supports a single parameter: "+ expression); visitor.Visit(args[0]); } else visitor.Visit(arg); AppendAdjustment(visitor, adjust, i + 1); } visitor.ResultBuilder.Append(suffix).Append(")"); AppendAdjustment(visitor, adjust, 0); }
/// <summary> /// Visits the method call expression. /// </summary> public static void VisitMethodCall(MethodCallExpression expression, CacheQueryExpressionVisitor visitor) { var mtd = expression.Method; VisitMethodDelegate del; if (!Delegates.TryGetValue(mtd, out del)) throw new NotSupportedException(string.Format("Method not supported: {0}.({1})", mtd.DeclaringType == null ? "static" : mtd.DeclaringType.FullName, mtd)); del(expression, visitor); }