private ProjectedObject Deserialize(string json, params BsonSerializationInfo[] serializationInfos)
 {
     using (var reader = new JsonReader(json))
     {
         var context    = BsonDeserializationContext.CreateRoot(reader);
         var serializer = new ProjectedObjectDeserializer(serializationInfos);
         return(serializer.Deserialize(context));
     }
 }
 private ProjectedObject Deserialize(string json, params BsonSerializationInfo[] serializationInfos)
 {
     using (var reader = new JsonReader(json))
     {
         var context = BsonDeserializationContext.CreateRoot(reader);
         var serializer = new ProjectedObjectDeserializer(serializationInfos);
         return serializer.Deserialize(context);
     }
 }
        private void VisitProjection(ProjectionExpression node)
        {
            Visit(node.Source);

            var serializationExpression = node.Projector as ISerializationExpression;

            if (serializationExpression != null)
            {
                var info = serializationExpression.SerializationInfo;
                if (info.ElementName != null)
                {
                    // We are projecting a field, however the server only responds
                    // with documents. So we'll create a projector that reads a document
                    // and then projects the field out of it.
                    var parameter = Expression.Parameter(typeof(ProjectedObject), "document");
                    var projector = Expression.Lambda(
                        Expression.Call(
                            parameter,
                            "GetValue",
                            new Type[] { info.Serializer.ValueType },
                            Expression.Constant(info.ElementName),
                            Expression.Constant(info.Serializer.ValueType.GetDefaultValue(), typeof(object))),
                        parameter);
                    var innerSerializer = new ProjectedObjectDeserializer(new[] { info });
                    _serializer = (IBsonSerializer)Activator.CreateInstance(
                        typeof(ProjectingDeserializer <,>).MakeGenericType(typeof(ProjectedObject), info.Serializer.ValueType),
                        new object[]
                    {
                        innerSerializer,
                        projector.Compile()
                    });
                    return;
                }
            }

            _serializer = SerializerBuilder.Build(node.Projector, _serializerRegistry);
        }
예제 #4
0
        private void TranslatePipeline(PipelineExpression node)
        {
            Translate(node.Source);

            var serializationExpression = node.Projector as ISerializationExpression;
            var fieldExpression = node.Projector as FieldExpression; // not IFieldExpression
            if (fieldExpression != null)
            {
                var info = new BsonSerializationInfo(fieldExpression.FieldName, fieldExpression.Serializer, fieldExpression.Serializer.ValueType);

                // We are projecting a field, however the server only responds
                // with documents. So we'll create a projector that reads a document
                // and then projects the field out of it.
                var parameter = Expression.Parameter(typeof(ProjectedObject), "document");
                var projector = Expression.Lambda(
                    Expression.Call(
                        parameter,
                        "GetValue",
                        new Type[] { info.Serializer.ValueType },
                        Expression.Constant(info.ElementName),
                        Expression.Constant(info.Serializer.ValueType.GetDefaultValue(), typeof(object))),
                    parameter);
                var innerSerializer = new ProjectedObjectDeserializer(new[] { info });
                _outputSerializer = (IBsonSerializer)Activator.CreateInstance(
                    typeof(ProjectingDeserializer<,>).MakeGenericType(typeof(ProjectedObject), info.Serializer.ValueType),
                    new object[]
                        {
                                innerSerializer,
                                projector.Compile()
                        });
            }
            else if (serializationExpression != null)
            {
                _outputSerializer = serializationExpression.Serializer;
            }
            else
            {
                throw new NotSupportedException();
            }

            _resultTransformer = node.ResultOperator as IResultTransformer;
        }
        private void VisitProjection(ProjectionExpression node)
        {
            Visit(node.Source);

            var serializationExpression = node.Projector as ISerializationExpression;
            if (serializationExpression != null)
            {
                var info = serializationExpression.SerializationInfo;
                if (info.ElementName != null)
                {
                    // We are projecting a field, however the server only responds
                    // with documents. So we'll create a projector that reads a document
                    // and then projects the field out of it.
                    var parameter = Expression.Parameter(typeof(ProjectedObject), "document");
                    var projector = Expression.Lambda(
                        Expression.Call(
                            parameter,
                            "GetValue",
                            new Type[] { info.Serializer.ValueType },
                            Expression.Constant(info.ElementName),
                            Expression.Constant(info.Serializer.ValueType.GetDefaultValue(), typeof(object))),
                        parameter);
                    var innerSerializer = new ProjectedObjectDeserializer(new[] { info });
                    _serializer = (IBsonSerializer)Activator.CreateInstance(
                        typeof(ProjectingDeserializer<,>).MakeGenericType(typeof(ProjectedObject), info.Serializer.ValueType),
                        new object[] 
                            { 
                                innerSerializer,
                                projector.Compile()
                            });
                    return;
                }
            }

            _serializer = SerializerBuilder.Build(node.Projector, _serializerRegistry);
        }