コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
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);
        }