Exemplo n.º 1
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));

            var arg = methodCall.Arguments[1].Unwrap();

            ISqlExpression expr;
            var            parameterize = Common.Configuration.Linq.ParameterizeTakeSkip;

            if (arg.NodeType == ExpressionType.Lambda)
            {
                arg  = ((LambdaExpression)arg).Body.Unwrap();
                expr = builder.ConvertToSql(sequence, arg);
            }
            else
            {
                // revert unwrap
                arg = methodCall.Arguments[1];

                expr = builder.ConvertToSql(sequence, arg);
                if (expr.ElementType == QueryElementType.SqlValue)
                {
                    var param = builder.BuildParameter(methodCall.Arguments[1], null, true).SqlParameter;
                    param.Name             = methodCall.Method.Name == "Take" ? "take" : "skip";
                    param.IsQueryParameter = param.IsQueryParameter && parameterize;
                    expr = param;
                }
            }

            if (methodCall.Method.Name == "Take")
            {
                TakeHints?hints = null;
                if (methodCall.Arguments.Count == 3 && methodCall.Arguments[2].Type == typeof(TakeHints))
                {
                    hints = (TakeHints)methodCall.Arguments[2].EvaluateExpression() !;
                }

                BuildTake(builder, sequence, expr, hints);
            }
            else
            {
                BuildSkip(builder, sequence, expr);
            }

            return(sequence);
        }