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