Exemple #1
0
        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);
        }
Exemple #3
0
 private BsonValue TranslateDocumentWrappedField(FieldAsDocumentExpression expression)
 {
     return(new BsonDocument(expression.FieldName, TranslateValue(expression.Expression)));
 }