Example #1
0
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            if (!_isClientSideProjection && EmbeddedPipelineBinder.SupportsNode(node))
            {
                return(BindEmbeddedPipeline(node));
            }

            switch (node.Method.Name)
            {
            case "ElementAt":
                return(BindElementAt(node));

            case "get_Item":
                return(BindGetItem(node));
            }

            // Select and SelectMany are the only supported client-side projection operators
            if (_isClientSideProjection &&
                ExpressionHelper.IsLinqMethod(node, "Select", "SelectMany") &&
                node.Arguments.Count == 2)
            {
                return(BindClientSideProjector(node));
            }

            return(base.VisitMethodCall(node));
        }
Example #2
0
        private Expression BindEmbeddedPipeline(MethodCallExpression node)
        {
            var oldIsInEmbeddedPipeline = _isInEmbeddedPipeline;

            _isInEmbeddedPipeline = true;

            node = node.Update(
                Visit(node.Object),
                Visit(node.Arguments));

            _isInEmbeddedPipeline = oldIsInEmbeddedPipeline;
            if (_isInEmbeddedPipeline)
            {
                return(node);
            }

            return(EmbeddedPipelineBinder.Bind(node, _bindingContext));
        }
Example #3
0
        private Expression BindEmbeddedPipeline(MethodCallExpression node)
        {
            var oldIsInEmbeddedPipeline = _isInEmbeddedPipeline;

            _isInEmbeddedPipeline = true;

            node = node.Update(
                Visit(node.Object),
                Visit(node.Arguments));

            _isInEmbeddedPipeline = oldIsInEmbeddedPipeline;
            if (_isInEmbeddedPipeline)
            {
                return(node);
            }

            // we need to discover if this is rooted at an IMongoQueryable... If so, it
            // gets processed as a top-level pipeline...

            return(EmbeddedPipelineBinder.Bind(node, _bindingContext));
        }