Exemple #1
0
        public Expression Bind(PipelineExpression pipeline, EmbeddedPipelineBindingContext bindingContext, MethodCallExpression node, IEnumerable <Expression> arguments)
        {
            var source = new ZipExpression(
                node.Type,
                pipeline.Source,
                arguments.First());

            var lambda = ExpressionHelper.GetLambda(arguments.Last());
            var input  = new DocumentExpression(bindingContext.GetSerializer(typeof(object[]), null));

            var itemA = new ArrayIndexExpression(
                input,
                Expression.Constant(0),
                bindingContext.GetSerializer(lambda.Parameters[0].Type, source.Source));
            var itemB = new ArrayIndexExpression(
                input,
                Expression.Constant(1),
                bindingContext.GetSerializer(lambda.Parameters[1].Type, source.Other));

            bindingContext.AddExpressionMapping(lambda.Parameters[0], itemA);
            bindingContext.AddExpressionMapping(lambda.Parameters[1], itemB);

            var selector = bindingContext.Bind(lambda.Body);

            var serializer = bindingContext.GetSerializer(selector.Type, selector);

            return(new PipelineExpression(
                       new SelectExpression(
                           source,
                           lambda.Parameters[0].Name + "_" + lambda.Parameters[1].Name,
                           selector),
                       new DocumentExpression(serializer)));
        }
Exemple #2
0
        private BsonValue TranslateZip(ZipExpression node)
        {
            var inputs = new[] { TranslateValue(node.Source), TranslateValue(node.Other) };

            return(new BsonDocument("$zip", new BsonDocument("inputs", new BsonArray(inputs))));
        }