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))); }
private BsonValue TranslateZip(ZipExpression node) { var inputs = new[] { TranslateValue(node.Source), TranslateValue(node.Other) }; return(new BsonDocument("$zip", new BsonDocument("inputs", new BsonArray(inputs)))); }