public SerializationExpression BindProjector(ref Expression selector) { var projector = selector as SerializationExpression; if (selector.NodeType == ExpressionType.MemberInit || selector.NodeType == ExpressionType.New) { var serializer = SerializerBuilder.Build(selector, _serializerRegistry); projector = new DocumentExpression(serializer); } else if (projector == null || projector is PipelineExpression || projector is IFieldExpression || projector is ArrayIndexExpression) { var newFieldName = "__fld0"; if (projector is IFieldExpression) { // We don't have to do this, but it makes the output a little nicer. newFieldName = ((IFieldExpression)projector).FieldName; } // the output of a $project stage must be a document, so // if this isn't already a serialization expression and it's not // a new expression or member init, then we need to create an // artificial field to project the computation into. var serializer = GetSerializer(selector.Type, selector); selector = new FieldAsDocumentExpression(selector, newFieldName, serializer); projector = new FieldExpression(newFieldName, serializer); } return(projector); }
protected internal override Expression VisitDocumentWrappedField(FieldAsDocumentExpression node) { var field = Visit(node.Document) as IFieldExpression; if (field != null) { return(new FieldExpression( node.PrependFieldName(field.FieldName), node.Serializer)); } return(node); }
private BsonValue TranslateDocumentWrappedField(FieldAsDocumentExpression expression) { return(new BsonDocument(expression.FieldName, TranslateValue(expression.Expression))); }