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)); }
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)); }
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)); }